自coldfusion MX引入CFC以来,一直在使用CFC架构系统,最近看AOP,考虑到将各CFC横向切面,一个很典型的用户权限验证逻辑,从各分散的CFC切出来,在做逻辑处理的时候注意到<component> 标签有个roles属性,发现使用该属性可以非常方便的分离类似用户权限验证这样的处理哦。

具体的方法如下:
本来原始的代码是每个CFC在处理前都会调用权限检测,判断是否由权限:

UserInfo.cfc

<cfcomponent>

<cffunction name=”getUserInfo” output=”true” access=”remote” hint=”get user information”>

<!—判断是否有权限,是否登陆—>
<cfif checkAuth()>

<!—-获取用户信息—->

<cfoutput>#resultXML#</cfoutput>
<cfelse>
<cfscript>releaseSystemError(1002,”无权限”)</cfscript>

</cffunction>

</cfcomponent>

以上组件直接提供给前台HTML通过XMLHttp调用。 每个需要进行权限验证的CFC都有和以上UserInfo.cfc类似的代码。

切割后的结构如下:引进一个request_delegate.cfc组件,负责接受前台的调用,调用相应的组件方法,并将结果以XML形式返回给HTML。

<cffunction

 name="get_response"
 access="remote"
 output="true">

<cftry>
  <!—调用相应组件方法—>
  <cfinvoke
     component="#component_name#"
     method="#component_method#"
     returnVariable="returnXML">
    <!… …>
  </cfinvoke>
  <cfoutput>#returnXML#</cfoutput>
</cfcatch type="any">
  <cfscript>
    releaseSystemError("1001″,"无权限")
  </cfscript>
</cfcatch>
</cftry></cffunction>

以上catch无权限event,返回相应的错误代码XML VIEW。

userInfo.cfc改为如下:

<cffunction name=”getUserInfo”

  access="public"
  output="false"
  roles="authGroup">  
<!—获取用户信息—>
  <cfreturn userInfo/></cffunction>

roles=”authGroup”表示该函数只能给拥有authGroup的用户调用。

在用户登陆的时候我们就可以使用<cfloginuser roles=”authGroup”/>将相应的权限给特定的用户,当该用户通过request_delegate访问相应的有权限控制的CFC时候,就能正确的访问,而如果没有权限的就会throws一个无权限的一个exception出来,这样一个非常简单又能满足一般实际需要的权限控制就出来了,而且将权限验证剥离出来,也更方便代码维护。

现在的userInfo.cfc的代码也比修改前的代码更合理而优雅…

一个好的系统要关注于:优雅…