我设置了角色、任务和操作层次结构,并分配给用户,操作镜像控制器:操作。
从docs中,如果我想检查用户是否有权访问操作,我会检查,例如:
if(Yii::app()->user->checkAccess('createPost'))
这给人的印象是我必须在每个操作中手动添加代码以检查用户是否被授权到相应的角色。我是否遗漏了某些东西-肯定有一种方法可以为每个动作自动执行此操作。
我可以扩展基本 Controller 类并添加一些东西(在 preFilter 中?)使用 Yii::app()->controller 和 Yii::app()->controller->action 来生成角色,然后检查用户被授权担任该角色。
但我确定一定有办法做到这一点?
我知道 accessRules 过滤器允许您传递角色,但这似乎违背了拥有角色>任务>操作层次结构的目的,并且必须为每个操作分配这样的规则几乎与在每个函数中进行检查一样糟糕第一名。
是否还有其他一些我缺少的选项会自动检查执行例如 /item/delete 的用户是否有权执行“item:delete”操作(或 DB AuthItem 表中预期的任何格式)?
编辑
在数据库 RBAC 旁边澄清我的 accessRules 问题:
我在我的数据库中定义了一个角色结构 - 多个角色,每个角色都被授权执行多个任务,这些任务又由细粒度操作组成(例如角色“读者”可能被授权执行任务“浏览帖子”,这是'post/index' 和 'post/view')。然后我将一个用户分配给一个角色,该角色授予他们对该角色的任务以及这些任务中的操作的权限。如果我随后为控制器操作(即操作)调用user->checkAccess ,它会在数据库中检查用户是否已获得角色的授权,该角色包含包含该操作的任务。
但是,如果我遍历每个控制器并定义每个操作被授权的角色,我正在复制我已经在数据库中完成的工作,可能会有冲突的规则。