RBAC Yii2不适用于默认角色

时间:2015-03-09 07:09:20

标签: php yii2 rbac

我正在关注Yii 2.0的权威指南。在我的应用程序中,我有两个角色:管理员,谁可以做任何事情和观众,谁可以做一些未注册用户不能做的行动。我正在尝试使用Yii 2 RBAC的默认角色功能,但它似乎不起作用。我的数据库中的用户表有一个名为“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,即使我是管理员也是如此。如何使它工作?

2 个答案:

答案 0 :(得分:3)

  

我的数据库中的用户表有一个名为&#34的列;角色":对于admin,它的值设置为1,对于viewers = 2

不幸的是,它不是如何运作的。 用户拥有的权限/角色(默认情况下)通过auth_assignment - 表完成。 只需在其中添加一个条目:

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

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

那应该可以解决你的问题。

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

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

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

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

答案 1 :(得分:3)

我在与op面临同样的问题。最后在修补xdebug一段时间后才开始工作。

我觉得关于default roles的官方文档遗漏了几个重点,我将在下面总结一下我的一些个人经历​​。项目结构基于Yii 2.0高级项目模板

数据库

user表包含idgroupgroup类型为intadmin为1,author为2

规则设置

为了清晰起见,

简化了代码。

规则类,您可以在其中放置实际的规则逻辑。

  

YII /控制台/控制器/ 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 /控制台/控制器/ 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 /黎民/配置/ main.php

将以下内容添加到返回数组中:

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

现在是有趣的部分,在控制器类下你想要应用规则

  

YII /后端/控制器/ SiteController.php

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

到目前为止,规则应该有效。在您的控制器类下,仔细检查Yii::$app->getAuthManager(),看它是否包含您定义的角色。如果没有,这意味着Yii没有正确地接受规则,请再次检查前面的步骤。