【问题标题】:RBAC Yii2 doesn't work with default rolesRBAC Yii2 不适用于默认角色
【发布时间】:2015-03-09 07:09:20
【问题描述】:

我正在关注 Yii 2.0 的权威指南。在我的应用程序中,我有两个角色:管理员,可以做任何事情;查看者,可以做一些未注册用户不能做的操作。我正在尝试使用 Yii 2 RBAC 的默认角色功能,但它似乎不起作用。我的数据库中的用户表有一个名为“role”的列:对于管理员,它的值设置为 1,对于查看器 = 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'],
                ],
            ],
        ],
    ];
}

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

【问题讨论】:

    标签: php yii2 rbac


    【解决方案1】:

    我的数据库中的用户表有一个名为“role”的列:对于管理员,它的值设置为 1,对于查看器 = 2

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

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

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

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

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

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

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

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

    【讨论】:

    • 我应该在该表中为每个新用户创建一个条目吗?
    • 对于所有需要特殊角色的人来说,是的。您还可以使用默认角色的概念,并根据其他条件分配一些角色。我已经用链接更新了我的答案。
    • 嗯。正如我从一开始在我的问题中提到的那样,我从 link 链接中做了这件事,但这不起作用。您可以看到我的 Rule-class 来自该链接。我的意思是,我从一开始就用 defaultRole 做这件事,但这是行不通的
    • 对不起,你是对的。我怀疑您可能忘记更新 authManager 配置,然后表明它应该始终检查 adminviewer 角色(该段的最后一段)
    • 嗯,这不是我想要的解决方案,但它可能是 yii 可以提供的唯一解决方案。标记为已解决。
    【解决方案2】:

    我在操作时遇到了同样的问题。经过一段时间的 xdebug 修改,终于让它工作了。

    我觉得default roles上的官方文档漏掉了几个重点,下面我将用我的一些个人经验来总结一下。项目结构基于 Yii 2.0 Advanced Project Template

    数据库

    user 表包含idgroup。其中groupint 类型,1 表示admin,2 表示author

    规则设置

    为清晰起见简化了代码。

    规则类,放置实际规则逻辑的位置。

    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

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

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

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

    yii/backend/controllers/SiteController.php

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

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

    【讨论】:

      猜你喜欢
      • 2016-06-23
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-13
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多