I have been working on implementing the security interceptor features
of coldbox and wanted to define my rule in a simple programatic way .
The base coldbox.system.interceptor.Security.cfc is looking for a
query object from either the ioc,model,cache, or actually db call. So
what i did was this first was this
COLDBOX.cfc
interceptors = [
//Security
{class="coldbox.system.interceptors.Security", properties={
rulesSource="model",
rulesModel="faaemployees.mobile.model.services.securityService",
rulesModelMethod="getRules",
validator="faaemployees.mobile.model.services.securityService",
preEventSecurity=true,
debugMode=true}
}
];
faaemployees.mobile.model.services.securityService.getRules()
<cfset local.qRules =
QueryNew("whitelist,securelist,roles,permissions,redirect","varchar,varchar,varchar,varchar,varchar") /
<cfset QueryAddRow(local.qRules) />
<cfset QuerySetCell(local.qRules,"whitelist","main\.login") />
<cfset QuerySetCell(local.qRules,"securelist",".*") />
<cfset QuerySetCell(local.qRules,"roles","") />
<cfset QuerySetCell(local.qRules,"permissions","") />
<cfset QuerySetCell(local.qRules,"redirect","main.login") />
This was just a little to kludgey for my liking. I really hate
building queries by hand.
So i dug a little further into the coldbox framework and overrode the
coldbox.system.interceptor.Security.loadModelRules() with this
<cffunction name="loadModelRules" access="private" returntype="void"
output="false" hint="Load rules from a model object">
<cfset var qRules = "">
<cfset var oModel = "">
<!--- Get rules from a Model Object --->
<cfset oModel = getModel(getproperty('rulesModel'))>
<cfif propertyExists('rulesModelArgs') and
len(getProperty('rulesModelArgs'))>
<cfset qRules =
evaluate("oModel.#getproperty('rulesModelMethod')#( #getProperty('rulesModelArgs')# )")>
<cfelse>
<!--- Now call method on it --->
<cfinvoke component="#oModel#"
method="#getProperty('rulesModelMethod')#" returnvariable="rules" />
</cfif>
<!--- validate query --->
<cfif isValid("query",rules)>
<cfset validateRulesQuery(qRules)>
<!--- let's setup the array of struct Rules now --->
<cfset setProperty('rules', queryToArray(rules))>
<cfset setProperty('rulesLoaded',true)>
<cfelseif isValid("array",rules)>
<cfset setProperty('rules', rules)>
<cfset setProperty('rulesLoaded',true)>
<cfelseif isValid("struct",rules)>
<cfset aRules = arrayNew(1) />
<cfset arrayAppend(aRules,rules) />
<cfset setProperty('rules', rules)>
<cfset setProperty('rulesLoaded',true)>
</cfif>
</cffunction>
so now my model call can return a single struct or an array of
structs. so now my coldbox.cfc looks like this
COLDBOX.cfc
interceptors = [
//Security
{class="faaemployees.mobile.model.interceptors.Security",
properties={
rulesSource="model",
rulesModel="faaemployees.mobile.model.services.securityService",
rulesModelMethod="getRules",
validator="faaemployees.mobile.model.services.securityService",
preEventSecurity=true,
debugMode=true}
}
];
and my getRules method looks like this
<cffunction name="getRules" returntype="array">
<cfset var local = structNew() />
<cfset local.rules = [
{whitelist = "main\.login", securelist = ".*", roles = "" ,
permissions = "", redirect = "main.login"}
] />
<cfreturn local.rules />
</cffunction>