Роли пользователя в Yii2, из значения БД

Это может показаться дублирующим, во-первых, но доступные ответы не имеют ясности и не решают мою проблему.

У меня есть список пользователей базы данных, один кортеж будет выглядеть примерно так:

[
        '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 фактически смущает меня, и мне трудно понять документацию.

Мне просто нужно создать три типа пользовательских ролей. Я понимаю контроль доступа к различным действиям.

Пользовательские данные поступают из таблицы, которая будет изменена в реальном времени другим приложением.

2 ответа

Решение

Решил это сам. Незначительные изменения в фреймворковом коде, я думаю, у меня возникнут проблемы, если я решу обновить 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;
}

Исходя из вашего собственного ответа, я вижу, что вам на самом деле не нужен 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->identity является null,

Другие вопросы по тегам