【问题标题】:Yii2 RBAC group assignment confusionYii2 RBAC 组分配混乱
【发布时间】:2015-09-08 07:43:28
【问题描述】:

我正在尝试按照 Yii 网站上的教程* 在我的项目中实施 RBAC。但是,当我尝试按组实现权限时我很困惑。

对于这个例子,我在用户表中添加了一个group 字段并定义了两个组,user (2)admin (1)

然后我创建了一个控制台命令,如下所示:

class RbacController extends Controller
{
    public function actionInit()
    {
        $auth = \Yii::$app->authManager;

        $rule = new \app\rbac\UserGroupRule;
        $auth->add($rule);

        $search = $auth->createPermission('search');
        $search->description = 'Search';
        $search->ruleName = $rule->name;
        $auth->add($search);

        $user = $auth->createRole('user');
        $user->ruleName = $rule->name;
        $auth->add($user);

        $admin = $auth->createRole('admin');
        $admin->ruleName = $rule->name;
        $auth->add($admin);
        $auth->addChild($admin, $user);
    }
}

我有这个文件:rbac/UserGroupRule.php

class UserGroupRule extends Rule
{
    public $name = 'userGroup';

    public function execute($user, $item, $params)
    {
        // return true; // force return to true for test
        if(!Yii::$app->user->isGuest) {
            $group = Yii::$app->user->identity->group;
            if($item->name === 'search') {
                return $group == 1;
        }
        return false;
    }
}

我正在尝试使用if(\Yii::$app->user->can('search')) 测试权限。

  1. 首先,我想知道为什么这里需要控制台命令,因为我看不到它在哪里使用。

  2. execute方法中的$item参数的值是search,但是教程显示它期望这个值是角色类型。

  3. 不管我在execute方法中返回什么,似乎都返回false。

谁能回答这些问题?

【问题讨论】:

    标签: php yii2 rbac


    【解决方案1】:

    我猜你有一个带有 DbManager 的 authManager ?

    'authManager' => [
            'class' => 'yii\rbac\DbManager',
        ],
    
    1. 要从控制台初始化 rbac,只需在控制台中使用yii rbac/init(在正确的项目目录中)然后数据库条目就完成了(在此之前 rbac 表应该是空的)

      如果您还没有创建表格

      yii migrate --migrationPath=@yii/rbac/migrations
      
    2. $item 只是 auth 权限或角色条目。如果您添加了规则,则会为每个条目调用该规则。在您的情况下,权限“搜索”和角色“用户”和“管理员”将执行规则。

    3. 您已添加带有规则检查的条目。所以如果你例如检查用户是否可以通过例如“搜索”

      if (\Yii::$app->user->can('search')) {
       // can search
      }
      

      然后检查或执行规则(这是您的 UserGroupRule)。在你的情况下,它会返回trueadminsfalseusergroup 字段给出。

    编辑: 我希望您已将其添加到配置文件中的组件中。

    return [
    // ...
    'components' => [
        'authManager' => [
            'class' => 'yii\rbac\DbManager',
        ],
        // ...
    ],
    ];
    

    您在 rbac(用户/管理员)中创建了 2 个角色,据我了解,您正在使用 User 表中的组列将这些角色分配给用户。在您的代码中,您将需要检查权限或角色。因此,从数据库中选择了正确的条目,如果附加了规则,则执行该规则。这将检查当前用户组并返回 true 或 false。因此,在您的情况下,没有完成对这些角色或权限的分配。它使用规则根据用户组返回真或假。但这里有其他搜索 yii2admin 或 yii2rbac 的扩展,您还可以通过数据库条目将用户分配给角色/权限等。

    我会说你应该在可以“聊天”的地方获得更多帮助,例如yii 主页上链接的 yii 聊天。

    【讨论】:

    • 感谢您的回复。是的,我应该提到我正在使用 DbManager,是的,我已经运行了控制台脚本来填充表。但是,您会在执行中看到注释行返回 true,但这似乎没有在 if(\Yii::$app->user->can('search')); 中注册。你给了我鼓励,我在正确的轨道上,当我早上上班时,我会再看一遍。
    • 如果您的$group = Yii::$app->user->identity->group; 正确返回,我会尝试调试。对于管理员用户,该组必须是 1,对于普通用户,该组必须是 2。尝试在您的UserGroupRule 中打印出来,例如die(Yii::$app->user->identity->group); 当你测试“搜索”权限时。
    • However you'll see the commented line in execute returns true but this doesn't seem to register with if(\Yii::$app->user->can('search')); 必须有效。如果您在规则中返回 true,而不管您的用户是否检查搜索权限,并且它不返回 true,那么其他地方就有问题了。你的规则被执行了吗?试试die('test');
    • 问题 1 我的意思是,一旦数据在数据库或文件中,当在组上下文中时,它在哪里被读取?如果这仍然需要,您在哪里/如何在此处分配组,而不是用户?
    • 和 @BHoft,如果我确实在那里返回 true,那么 RBAC 表在哪里发挥作用?我觉得好像这些表被忽略了,这就是我想要的。我仍然不明白这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多