0

我有一个关于 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 表中更新他的授权。

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

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

迈克尔·S。

4

2 回答 2

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')) {
    ....
}

在您的 WebUserhasGroupAccess方法中,您可以遍历所有组角色并将其发送到 checkAccess。

认为这会奏效吗?

于 2013-01-27T22:03:51.940 回答
0

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

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

下:使用默认角色

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

例如,在您的情况下,business ruleforR&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
  • if there is a group: return true (else return false)
于 2013-01-31T12:42:57.287 回答