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