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