你是对的,保护页面和保护元素是不同的。
在我看来和实践中,我认为将任何代码绑定到角色或用户实际上是错误的方法。相反,将权限绑定到元素和页面 - 然后将角色绑定到这些权限。当然,用户被分配了角色。
拥有所有三个很重要:
- 用户
- 角色
- 权限<-这就是您所缺少的
权限是安全元素和页面,而不是角色或用户 您的代码应该不知道(因为它不需要)存在哪些用户或角色 - 只是权限的名称。
当用户登录时,我会获取他们的角色。然后我获取分配给这些角色的所有权限(只是字符串值的列表)。
例如,在我可能有的页面上:
当我对该页面进行编码时,我实际上使用名为类似(addItem、viewItem、deleteItem)的权限字符串来保护这些元素中的每一个。
<cfif listContainsNoCase( session.permissions, 'addItem' )>
<!--- code to add item --->
</cfif>
(注意:我建议为此使用自定义标签或函数,但出于示例的目的,上述工作正常)。
如果你这样做,它提供了最大的灵活性和抽象性。如果你根据角色保护元素,你就会限制自己:
- 添加新角色将需要大量代码更改!
- 更改角色之间的权限需要大量代码更改!
如果你按照上面提到的那样做,你永远不需要在代码库中更改你的安全代码,因为“addItem”权限应该总是在“add item”逻辑上,对吧?:)
现在,如果您碰巧需要创建一个“经理”类型的角色,它具有所有用户角色和一些管理员权限,您只需创建该角色,并为其分配正确的权限(可能是 addItem 和 editItem,但不是 deleteItem) . 砰!现在我有一个经理角色可以分配给没有代码更改的用户!
如果我在我的代码中添加了“用户是这个角色”类型的东西——我将不得不到处编辑我的代码以允许我的新角色“经理”——太糟糕了!
说得通?
=)