0

一开始这听起来可能是重复的,但可用的答案不够清晰,也不能解决我的问题。

我有一个用户数据库列表,一个元组看起来像下面这样。

[
        'id' => '131',
        'username' => 'mat',
        'password' => '9a23b6d49aa244b7b0db52949c0932c365ec8191',
        'authKey' => 'test100key',
        'accessToken' => '100-token',
        'role' => 'editor',
    ]

现在我想创建一种名为 manager 的用户,并在控制器中设置这样的访问控制。

'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['create', 'view', 'index'], // Define specific actions
                    'allow' => true, // Has access
                    'roles' => ['editor'], // '@' All logged in users / or your access role e.g. 'admin', 'user'
                ],
                [

我试图以最少的麻烦来实现这一点,但我对 yii/yii2 并不是很熟悉。RBAC 实际上让我感到困惑,我发现很难理解文档。

我只需要创建三种类型的用户角色。我了解控制对各种操作的访问。

用户数据来自将由另一个应用程序实时修改的表。

4

2 回答 2

1

根据您自己的回答,我认为您实际上并不需要 RBAC,这只是检查用户的一个属性的问题。您可以直接在控制器中执行此操作(并且无论如何都不能修改核心文件):

在控制器中添加:

public function behaviors()
{
    return [
        'access' => [
            'class' => \yii\filters\AccessControl::className(),
            'only' => ['create', 'view', 'index'],
            'rules' => [
                [
                    'allow' => true,
                    'matchCallback' => function ($rule, $action) {
                        return !\Yii::$app->user->isGuest 
                            && \Yii::$app->user->identity->role === 'editor';
                    },
                ],
            ],
        ],
    ];
}

matchCallback是将被调用以确定是否应应用规则的回调。您需要先检查用户是否不是客人,否则Yii::$app->user->identitynull

于 2017-04-21T05:59:17.443 回答
0

自己解决了。框架代码稍作调整,如果我选择随时更新 Yii,我想我会遇到麻烦。

vendor/yiisoft/yii2/filters/AccessRule.php 编辑了 matchRole 方法如下

    protected function matchRole($user)
{
    if (empty($this->roles)) {
        return true;
    }
    foreach ($this->roles as $role) {
        if ($role === '?') {
            if ($user->getIsGuest()) {
                return true;
            }
        } elseif ($role === '@') {
            if (!$user->getIsGuest()) {
                return true;
            } 
        } elseif ($user->can($role)) {
            return true;
        }
        elseif (isset($user->identity->role)){
            if($role == $user->identity->role) {
                return true;
            }
        }
    }

    return false;
}
于 2017-04-20T18:49:57.573 回答