我对rbac系统有疑问。我想我很了解它,但我需要更多关于特殊情况的信息。
我想对群组而不是用户进行自动曝光。我的意思是例如“HR”组有权创建一个人。那么加入这个群体的任何人都会拥有它。
让我给你更多的信息。
我的数据库的一部分:
这是我的小组层次结构的一部分:
所以我正在寻找,这将是必须的,是一个系统,每个组都有一些自动化。人们得到他们的团体和他们的父母团体的自动化(例如“Forsys”中的人具有“Forsys”,“R& D”和“Administration”的自动化。)
我目前看到的解决方案是使用 bizrule 。但我不确定在数据库中编写php代码是个好主意然后如果我更新组层次结构(R& D继承RH而不是管理)我将不得不修改数据库中的bizrule。我尝试了它并且效果很好但是你可以看到它需要很多代码。
$user = User::model()->with("people","people.groups")->findByPk(Yii::app()->user->id);
foreach($user->people[0]->groups as $group)
if($group->id == 2)
return true;
return false;
仅用于查看用户是否在某个组中(不检查父组和层次结构)
另一种可能性是创建一个新的表“group_auth”,我们会说:例如:
-Group_2的角色为“managePerson”
-Group_3有“deleteUser”操作 ...
然后,每次添加或删除组时,我们都会在auth_assigment表中更新其自动化。
我想听听关于这个问题的其他意见。 所有评论将不胜感激:)
如果您难以理解我,请感谢您阅读并抱歉我的英语。
MichaëlS。
答案 0 :(得分:0)
用户是否获得了自己的授权项目?如果没有,似乎你可以在auth_assignment中交换出userid列,并将其命名为/将其视为groupID。这样您就不必担心让用户身份验证分配与您的组角色保持同步。
您可能需要进行一些更改: - 默认情况下,CWebUser传入登录的用户ID以用于bizrules。可能很好地改变我们使用你自己的覆盖,而不是通过groupId / groupIds传递。 - 你需要覆盖CDbAuthManager并重做一些工作方式
我们已经在我正在处理的项目(我们正在处理多租户RBAC自定义权限)上做了类似的事情,这需要自定义CDbAuthManager覆盖。如果你这样做会有点棘手,但是有很多可用的功能。
修改强> 了解您的用户有时需要获得其他授权。如果您的小组有“角色”,该怎么办?在其中序列化了不同角色的字段(或者为该组存储多个角色的其他方法,也可以是关系)。
然后,在用户登录时(为了提高效率),您将这些角色存储在会话中。处理事情的最简单方法可能是为WebUser覆盖编写自定义checkAccess: https://github.com/yiisoft/yii/blob/1.1.13/framework/web/auth/CWebUser.php#L801
因为这样可以简化自定义检查。然后我可能会做类似的事情:
if(Yii::app()->user->hasGroupAccess() || Yii::app()->user->checkAccess('operation/task/role')) {
....
}
在您的WebUser hasGroupAccess
方法中,您可以遍历所有组角色并将其发送到checkAccess。
认为这会有效吗?
答案 1 :(得分:0)
当我在另一个表中或应用程序中的其他位置使用组时,我用它来检查组的访问权限。我默认为用户提供该角色。通过使用:
return array(
'components'=>array(
'authManager'=>array(
'class'=>'CDbAuthManager',
'defaultRoles'=>array('authenticated', 'R&D', 'Administration'),
),
),
);
通过使用此功能,每个用户都可以获得这些分配。现在,我创建了一个business rule
,以确保checkAccess('group')
将返回正确的值。
例如,在您的情况下,business rule
的{{1}}将为:
R&D
所以它的作用是:
return (
count(
Person::model()->findByPk(Yii::app()->user->id)->groups(array('name'=>'R&D'))
) > 0
) ? true : false;
find the logged-in person by primary key
look into groups (from the user) for the group with name R&D