Yii2 RBAC组分配混乱

时间:2015-09-08 07:43:28

标签: php yii2 rbac

我正在尝试按照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。

  4. 有人可以回答这些问题吗?

1 个答案:

答案 0 :(得分:0)

我猜你有一个带有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)。在您的情况下,它会返回true的{​​{1}}和admins字段给出的false的{​​{1}}。

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

    user

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

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