Закрыть доступ к приложению определенной роли RBAC

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
lostdok
Сообщения: 48
Зарегистрирован: 2016.09.05, 18:23

Закрыть доступ к приложению определенной роли RBAC

Сообщение lostdok »

Шаблон приложения: advanced У меня 2 приложения: backend и frontend.

Мне необходимо, чтобы в backend имели доступ все роли, кроме client.

Я написал следующее в main.php:

Код: Выделить всё

'as beforeRequest' => [
    'class' => 'yii\filters\AccessControl',
    'rules' => [
        [
            'allow' => true,
            'controllers' => ['site'],
            'actions' => ['login'],
        ],
        [
            'allow' => false,
            'roles' => ['client'],
        ],
    ],
    'denyCallback' => function () {
        return Yii::$app->response->redirect(['site/login']);
    },
],
В итоге получаю ошибку: ERR_TOO_MANY_REDIRECTS

Как я понял все происходит так:

Пользователь заходит на site/login.
Авторизуется в системе. У него роль client. Доступ запрещен.
Идет редирект на site/login.
Пользователь уже авторизован. И у него роль client. Доступ запрещен.
См. 3
Бесконечный редирект...

Как этого избежать и закрыть доступ?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Закрыть доступ к приложению определенной роли RBAC

Сообщение samdark »

В denyCallback сделать редирект на отдельную страницу, разрешённую всем, где описать что клиентам сюда нельзя и вывести ссылку на "попробовать ещё раз", которая отлогинит юзера и редиректнет на логин.
lostdok
Сообщения: 48
Зарегистрирован: 2016.09.05, 18:23

Re: Закрыть доступ к приложению определенной роли RBAC

Сообщение lostdok »

Сделал так:

main.php

Код: Выделить всё

'as beforeRequest' => [
        'class' => yii\filters\AccessControl::class,
        'rules' => [
            [
                'allow' => true,
                'controllers' => ['site'],
                'actions' => ['login', 'access-denied'],
            ],
            [
                'allow' => false,
                'roles' => ['client'],
            ],
        ],
        'denyCallback' => function () {
            if( ! Yii::$app->user->isGuest ) {
                Yii::$app->user->logout();
            }
            return Yii::$app->response->redirect(['site/access-denied']);
        },
    ], 

SiteController.php

Код: Выделить всё

<?php
namespace backend\controllers;

use Yii;
use yii\web\Controller;
use common\models\LoginForm;

/**
 * Site controller
 */
class SiteController extends Controller
{
    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function actionIndex()
    {
        return $this->render('index');
    }

    public function actionLogin()
    {
        if (!Yii::$app->user->isGuest) {
            return $this->goHome();
        }

        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
            return $this->goBack();
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }

    public function actionLogout()
    {
        Yii::$app->user->logout();

        return $this->goHome();
    }

    public function actionAccessDenied()
    {
        $this->layout = 'main-login';
        return $this->render('access-denied');
    }
} 

Все работает хорошо. Но почему-то не могу войти в систему ни под одним пользователем. Мне необходимо, чтобы не смогли входить пользователи только с ролью "client". У моего пользователя уставлена роль 'root'. В нее не входит 'client'.

Код: Выделить всё

Yii::$app->user->can('client') 
для моего админа возвращает false.

Не понимаю почему при такой конфигурации AccessControl запрещает доступ.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Закрыть доступ к приложению определенной роли RBAC

Сообщение samdark »

Потому что по умолчанию всё запрещено.
lostdok
Сообщения: 48
Зарегистрирован: 2016.09.05, 18:23

Re: Закрыть доступ к приложению определенной роли RBAC

Сообщение lostdok »

Сделал так:

Код: Выделить всё

//... 
'as beforeRequest' => [
        'class' => yii\filters\AccessControl::class,
        'rules' => [
            [
                'allow' => true,
                'controllers' => ['site'],
                'actions' => ['login', 'access-denied'],
            ],
            [
                'allow' => false,
                'roles' => ['client'],
            ],
            [
                'allow' => true,
                'roles' => ['@']
            ]
        ],
        'denyCallback' => function () {
            if( ! Yii::$app->user->isGuest ) {
                Yii::$app->user->logout();
            }
            return Yii::$app->response->redirect(['site/access-denied']);
        },
    ],
    //...  
Работает.
Ответить