RBAC Yii2 不适用于默认角色

RBAC Yii2 doesn't work with default roles

我正在关注 Yii 2.0 权威指南。在我的应用程序中,我有两个角色:管理员,可以做任何事情;查看者,可以执行一些未注册用户无法执行的操作。我正在尝试使用 Yii 2 RBAC 的默认角色功能,但它似乎不起作用。我的数据库中的用户 table 有一个名为 "role" 的列:对于 admin,它的值设置为 1,对于 viewers = 2。

我做了什么:

/app/rbac/UserGroupRule.php

namespace app\rbac;

use Yii;
use yii\rbac\Rule;

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

    public function execute($user, $item, $params) {
        if (!Yii::$app->user->isGuest) {
            $group = Yii::$app->user->identity->role;
            if ($item->name === 'admin') {
                return $group == 1;
            } elseif ($item->name === 'viewer') {
                return $group == 1 || $group == 2;
            }
        }
        return false;
    }
}

$auth = Yii::$app->authManager;

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

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

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

在我的控制器中:

public function behaviors() {
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['admin'],
            'rules' => [
                [
                    'allow' => true,
                    'actions' => ['admin'],
                    'roles' => ['admin'],
                ],
            ],
        ],
    ];
}

当我尝试访问 "admin" 操作时,它显示 Forbidden #403,即使我是管理员也是如此。如何让它发挥作用?

The user table in my database has a column named "role": for admin it's value set to 1 and for viewers = 2

不幸的是,这不是它的工作原理。 用户拥有的 rights/roles 是(默认情况下)通过 auth_assignment-table 完成的。 只需在其中添加一个条目:

INSERT INTO `auth_assignment` VALUES ("admin", <user-id>, NOW());

(请务必将用户 ID 更改为您想要设为管理员的任何用户。

这应该可以解决您的问题。

编辑(因为我误读了你的一些问题):

根据 this link,您确实可以定义默认角色,但您还必须确保在配置文件中重新配置 authManager-组件以包含默认角色:

'components' => [
    'authManager' => [
        // ...
        'defaultRoles' => ['admin', 'viewer'],
    ],
],

此角色列表指示始终应为每个用户检查的权限,无论他们是否在 auth_assignment-table 中有条目。

我遇到了与 op 相同的问题。在修改了一段时间的 xdebug 后终于让它工作了。

我觉得default roles的官方文档遗漏了几个要点,我将在下面结合我的一些个人经验对其进行总结。项目结构基于Yii 2.0 Advanced Project Template

数据库

user table 包含 idgroup。其中 group 是类型 int,1 表示 admin,2 表示 author

规则设置

为清楚起见简化了代码。

规则 class,放置实际规则逻辑的地方。

yii/console/controller/UserGroupRule.php

namespace app\rbac;

use Yii;
use yii\rbac\Rule;

/**
 * Checks if user group matches
 */
class UserGroupRule extends Rule
{
    public $name = 'userGroup';

    public function execute($user, $item, $params)
    {
        if (!Yii::$app->user->isGuest) {
            $group = Yii::$app->user->identity->group;
            if ($item->name === 'admin') {
                return $group == 1;
            } elseif ($item->name === 'author') {
                return $group == 1 || $group == 2;
            }
        }
        return false;
    }
}

现在定义角色..

yii/console/controller/RbacController.php

namespace console\controllers;

use Yii;
use yii\console\Controller;

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

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

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

        // define 'author' here...
    }
}

准备好此文件后,您应该可以运行 ./yii rbac/init 生成规则文件:

  • console/rbac/items.php
  • console/rbac/rules.php

重要提示:您需要将生成的文件放在您想要的应用程序文件夹下,这一点至关重要。否则 Yii 2.0 将无法接受规则。例如:yii/backend/rbac/

控制器和配置设置

这与文档大部分相同

yii/commom/config/main.php

将以下内容添加到 return 数组:

'authManager' => [
    'class' => 'yii\rbac\PhpManager',
    'defaultRoles' => ['admin', 'author'], // your define roles
],  

现在是有趣的部分,在控制器下class您想应用规则

yii/backend/controllers/SiteController.php

'access' => [
    'class' => AccessControl::className(),
    'rules' => [
        [
            'allow' => true,
            'actions' => [], // applies to all actions
            'roles' => ['admin'], // your defined roles
        ],
    ],
 ],

到目前为止,规则应该有效。在您的控制器 class 下,仔细检查 Yii::$app->getAuthManager() 看看它是否包含您定义的角色。如果不是,则说明 Yii 没有正确选择规则,请再次检查前面的步骤。