我正在尝试使用Zend_Acl创建RBAC。我的问题是我希望用户能够拥有多个角色,但我不确定如何解决各种角色之间的权限冲突?如果allow和deny都有,那么allow是否应该覆盖deny?一如既往,非常感谢您抽出时间查看我的问题。干杯!
答案 0 :(得分:2)
把它想象成你的家。
假设你对俄罗斯人有不好的感觉。你认为,你应该否认你的好朋友只是因为他是俄罗斯人才能进入你的家吗?不,他已经证明了一些让他成为“朋友”身份的品质。允许应该覆盖否认IMO。
对俄罗斯人没有冒犯:P
答案 1 :(得分:1)
您应该为您的实施添加角色优先级。如果多个角色中存在确切的资源/特权对,您将在其中获得具有最高优先级的资源/特权对。如果没有任何角色完全匹配 - 请返回任何更高优先级的角色。
另一种方法是定义用户角色,例如user123
$ acl-> addRole('user123',array('admin','banned'));
我不知道具有多个父角色的角色行为,因此请亲自检查
答案 2 :(得分:1)
安全性最佳做法表明存在冲突时发生拒绝。
话虽如此,根据实际经验,我以下列方式建立安全性(当谈到RBAC时):
每个用户都有一组权利;用户权限取代了组权限 每个用户可以拥有一个或多个组权限 每个小组都有优先级别的申请;通常管理员应用于最后一个应用权限 我很少将多个小组应用于多个人;并且大多数有权申请权利的人都不能这样做,除了主要管理员(而是我创建一个新的组)。 我非常谨慎地使用Negative(拥有Deny权利的团体)。 在向一个人申请团体权利后,我让系统检查冲突并通知申请人。 除了标准的RBAC角色,我还有一个标志授权视图,其他人,授予编辑其他人等等。
另外使用许多其他机制,例如sha256会话令牌,使用数据库表临时检查空闲会话+重放攻击,要求人的IP地址保持不变等等。
答案 3 :(得分:0)
两种变体都很好,问题是你更喜欢什么?将“拒绝”优先级高于“允许”将导致系统中单个“拒绝”许可将权利带走,无论其他人说什么都不重要,反之亦然 - 将“允许”作为更高优先级将导致单个“允许”尽管有许多“否定”,但仍会给予许可。所以问题是 - 你的系统应该有多严格?