yii rbac:检查组而不是用户的自动化

时间:2013-01-27 19:16:47

标签: yii rbac

我对rbac系统有疑问。我想我很了解它,但我需要更多关于特殊情况的信息。

我想对群组而不是用户进行自动曝光。我的意思是例如“HR”组有权创建一个人。那么加入这个群体的任何人都会拥有它。

让我给你更多的信息。

我的数据库的一部分: enter image description here

这是我的小组层次结构的一部分: enter image description here

所以我正在寻找,这将是必须的,是一个系统,每个组都有一些自动化。人们得到他们的团体和他们的父母团体的自动化(例如“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。

2 个答案:

答案 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'),
        ),
    ),
);

Under: Using Default Roles

通过使用此功能,每个用户都可以获得这些分配。现在,我创建了一个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