我正在查看我的界面设计,并且在确定要访问的a user
和a的情况下subject
,我正在努力确定哪种方法是实现基于角色的访问控制的最“正确”方法user
。
据我所知,我有三个核心选择(第四个是前三个的混蛋,第五个是第四个的调整):
- 使用
subject
具有以下权限的列表来查询user
:subject.allowAccess(user.getPermissionSet)
user
使用subject
所需的权限列表查询-user.hasPermissionTo(subject.getRequiredPermissions())
- 查询第三方以找到权限的交集-
accessController.doPermissionSetsIntersect(subject.permissionSet, user.getPermissionSet())
- 查询
subject
/user
,同时将“决定”委托给第三方类 - 有
user
尝试访问subject
,并抛出一个错误,如果不允许访问
我倾向于选项四-具有subject
包含一个accessController
字段,在其中调用subject.userMayAccess(User user)
将操作委托给la:
class Subject {
public function display(user) {
if(!accessController.doPermissionSetsIntersect(this.permissionSet, user.getPermissionSet())) {
display403(); //Or other.. eg, throw an error..
}
}
}
..但这又引发了进一步的问题:
- 应该
accessController
是字段还是静态类..? - 是否应该
subject
知道查看权限需要什么权限? - 关于召唤,最少知识的原理在哪里起作用
subject.display()
?subject.display()
曾经的呼叫者应该知道访问控制有效吗?(subject.display()
最终的“模板方法” 在哪里) - 具有
subject.display()
管理访问控制,在用户没有所需权限的情况下引发异常?
在这种情况下,什么被认为是“最佳实践”?实际执行检查的责任应该在哪里发生?
由于这既是一项学术性的专业知识,其又将逐步发展为实施,因此将不胜感激对设计模式的引用。