yii rbac:检查组而不是用户的权限

yii rbac:检查组而不是用户的权限,yii,rbac,Yii,Rbac,我有一个关于rbac系统的问题。我想我已经很明白了,但是我需要更多关于一个特殊案例的信息 我想对组而不是用户进行自动回复。我的意思是,例如,组“HR”具有创建人员的权限。那么任何加入这个团体的人也会拥有它 让我给你更多的信息 我的数据库的一部分: 这是我的组层次结构的一部分: 所以我想要的是,这是必须的,是一个每个组都有一些权限的系统。人们获得了他们的组和他们父母组的权限(例如,“Forsys”中的人拥有“Forsys”、“R&D”和“Administration”的权限) 我目前看到的解决

我有一个关于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”,我们可以在其中说,例如:

-第2组具有“经理”角色

-组3具有操作“deleteUser”

然后,每当用户加入或删除组时,我们都会在auth_assignment表中更新他的权限

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

感谢您的阅读,如果您理解我有困难,请原谅我的英语


Michaël S.

用户是否有过自己的授权项目?如果没有,看起来您实际上可以交换auth_赋值中的userid列,并将其命名为groupID。这样,您就不必担心将用户身份验证分配与组角色保持同步

您可能需要在以下几个地方进行一些更改: -默认情况下,CWebUser传入已登录的用户ID,以便在bizrules中使用。最好使用您自己的覆盖来更改这个值,该覆盖改为传入groupId/groupId。 -您需要覆盖CDbAuthManager,并修改其中的一些工作方式

我们在我工作过的一个项目上做了类似的事情(我们正在处理多租户RBAC自定义权限),它需要自定义CDbAuthManager覆盖。如果你这样做会变得有点棘手,但是你有很多的能量

编辑: 了解您的用户有时需要额外的授权。如果您的组有一个“角色”字段,其中序列化了不同的角色(或者为该组存储多个角色的其他方法,也可以是关系),该怎么办

然后,在用户登录时(为了提高效率),您将在会话中存储这些角色。处理问题的最简单方法可能是为您的WebUser覆盖编写自定义checkAccess:

因为这将使定制检查变得更简单。然后我可能会做一些类似的事情:

if(Yii::app()->user->hasGroupAccess() || Yii::app()->user->checkAccess('operation/task/role')) {
    ....
}
在WebUser
hasGroupAccess
方法中,您可以循环所有组角色,并将它们发送给checkAccess


您认为这样行吗?

当组位于另一个表中或应用程序中的其他位置时,我使用什么检查组的访问权限?我为用户提供了默认角色。通过使用以下命令:

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

通过使用它,每个用户都可以获得这些分配。现在,我创建一个
业务规则
,以确保
检查访问('group')
将返回正确的值

例如,在您的案例中,
研发
业务规则将是:

return (
    count(
        Person::model()->findByPk(Yii::app()->user->id)->groups(array('name'=>'R&D'))
    ) > 0
) ? true : false;
因此,它的作用是:

  • 通过主键查找登录的用户
  • 查看名为R&D的组的组(来自用户)
  • 如果有组:返回true(否则返回false)

实际上,我需要的是用户从他们的组中获得他们的自动化,但也必须能够直接为他们分配自动化。用户不一定是个人(所以它不一定有组),但我必须能够给它一些权限。例如,一个为期两个月的受训者只需要一到两次授权,但不会整合到任何团队中。所以我不能仅仅用“组id”来修改“用户id”,这是有道理的。我已经发布了一些关于如何处理它的最新想法。