【问题标题】:yii rbac: check autorizations on groups instead of usersyii rbac:检查组而不是用户的授权
【发布时间】:2013-01-31 20:42:57
【问题描述】:

我有一个关于 rbac 系统的问题。我想我已经很好理解了,但我需要有关特殊情况的更多信息。

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

让我给你更多的信息。

我的数据库的一部分:

这是我的组层次结构的一部分:

所以我正在寻找的,这是必须的,是一个每个组都有一些授权的系统。人们得到他们的组和他们父母组的授权(例如“Forsys”中的人拥有“Forsys”、“R&D”和“管理”的授权)。

我目前看到的解决方案是使用 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 表中更新他的授权。

我想听听关于这个主题的其他意见。 所有 cmets 将不胜感激:)

感谢您的阅读,如果您在理解我时遇到困难,请原谅我的英语。

迈克尔·S.

【问题讨论】:

    标签: yii rbac


    【解决方案1】:

    用户是否曾经获得过自己的授权项目?如果不是,似乎您实际上可以换出 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。

    你认为这会奏效吗?

    【讨论】:

    • 实际上我需要的是用户从他们的组中获得他们的授权,但也必须可以直接为他们分配授权。用户不一定是一个人(所以它不一定有一个组),但我必须能够给它一些授权。例如两个月的实习生只需要一个或两个授权,但它不会集成到任何组中。所以我不能用“group_id”修改“user_id”。
    • 这是有道理的。我已经发布了一些关于如何处理它的更新想法。
    【解决方案2】:

    当我在另一个表中或应用程序中的其他位置时,我使用什么来检查组的访问权限,我默认为用户赋予角色。通过使用这个:

    return array(
        'components'=>array(
            'authManager'=>array(
                'class'=>'CDbAuthManager',
                'defaultRoles'=>array('authenticated', 'R&D', 'Administration'),
            ),
        ),
    );
    

    Under: Using Default Roles

    通过使用它,每个用户都可以获得这些分配。现在,我创建一个business rule 以确保checkAccess('group') 将返回正确的值。

    例如,在您的情况下,R&Dbusiness rule 将是:

    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
    • if there is a group: return true (else return false)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多