ColdFusion:基于角色的应用选项?

dco*_*bus 1 mysql coldfusion security-roles user-roles

我了解如何通过实现<cflogin>和角色来限制整个页面甚至组件.例如:

<cfif IsUserInRole("Admin") OR IsUserInRole("Accounting")>
    ...You can view this page...
<cfelse>
    ...You can not view this page...    
</cfif>
Run Code Online (Sandbox Code Playgroud)

但是如何建议限制页面的某些方面呢?例如,允许"管理员"向所有用户发送全局消息,但该选项不适用于常规"用户"

我想我可以使用Session来操作我的视图(页面).这通常如何处理?

Nat*_*ate 6

你是对的,保护页面和保护元素是不同的.

在我看来,在实践中,我认为将任何代码绑定到角色或用户实际上是错误的方法.相反,将权限绑定到元素和页面 - 然后将角色绑定到这些权限.当然,用户也被分配了角色.

拥有这三个是很重要的:

  1. 用户
  2. 角色
  3. 权限< - 这就是你所缺少的

权限是安全元素和页面,而不是角色或用户 您的代码应该没有线索(因为它不需要)有哪些用户或角色 - 只是权限的名称.

当用户登录时,我会抓住他们的角色.然后我获取分配给这些角色的所有权限(只是一个字符串值列表).

例如,在我可能拥有的页面上:

  • 新增项目
  • 查看项目
  • 删除项目

当我对该页面进行编码时,我实际上使用名为similar(addItem,viewItem,deleteItem)的权限字符串来保护每个元素.

<cfif listContainsNoCase( session.permissions, 'addItem' )>
    <!--- code to add item --->
</cfif>
Run Code Online (Sandbox Code Playgroud)

(注意:我建议使用自定义标记或功能,但出于示例的目的,上述工作正常).

如果你这样做,它提供了最大的灵活性和抽象.如果您根据角色保护元素,则限制自己:

  • 添加新角色需要进行大量代码更改!
  • 更改角色之间的权限需要进行大量的代码更改!

如果你这样做,你将永远不需要在代码库中更改安全代码,因为"addItem"权限应始终在"添加项目"逻辑上,对吧?:)

现在,如果您碰巧需要创建一个"管理员"类型角色,它具有所有用户角色和少数几个管理员权限,您只需创建该角色,并为其分配正确的权限(可能是addItem和editItem,但不是deleteItem) .巴姆!现在我有一个管理员角色分配给没有代码更改的用户!

如果我用"用户这个角色"类型的东西撒上我的代码 - 我必须在任何地方编辑我的代码以允许我的新角色"经理" - 哎呀!

合理?

=)