Подскажите как лучше сделать ограничение доступа

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Закрыто
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Подскажите как лучше сделать ограничение доступа

Сообщение evgeniy123 »

Есть табличка user_driver . В ней есть статус поле status. Sami водители могут быть заплокировани установкой статуса в этой таблице. Есть уже рабочий RBAC с ролями.
Как сделать чтобы проверка была на то, что это заблокировании водитель и делать редирект ('/login') если это условие выполняется
Пока только идея есть в beforeAction проверять что за роль у человека и смотреть поле status у него . Можно ли перенести это дело в AccessControl ?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Подскажите как лучше сделать ограничение доступа

Сообщение Nex-Otaku »

AccessControl сам ничего не редиректит, он может только исключение вызвать и отобразить "Доступ запрещён".

Как можно реализовать:

1. Создать роль "activeDriver", привязать к ней правило для проверки водителя.
Правило:

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

class ActiveDriverRule extends Rule
{
    public $name = 'isActiveDriver';
    
    public function execute($user, $item, $params)
    {
        if (empty($user)) {
            return false;
        }
        return $user->userDriver->status === 'goodStatus';
    }
}
Создаём роль, привязываем правило. Можно сделать вручную через админку, либо таким кодом в консольном контроллере.

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

$auth = Yii::$app->authManager;

// Создаём правило "isActiveDriver".
$isActiveDriver = new ActiveDriverRule();
$auth->add($isActiveDriver);

// Добавляем роль "activeDriver", прикрепляем к ней правило для проверки.
$activeDriver = $auth->createRole('activeDriver');
$activeDriver->description = 'Незаблокированный водитель';
$activeDriver->ruleName = $isActiveDriver->name;
$auth->add($activeDriver);
2. Указываем роль в списке доступа к экшену.

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

[
    'allow' => true,
    'actions' => ['bla-bla-bla'],
    'roles' => ['activeDriver'],
],
3. Добавляем редирект для всех, кому запрещён доступ:

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

'denyCallback' => function($rule, $action) {
    return $action->controller->redirect('user/login');
},
Примерно так.
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Подскажите как лучше сделать ограничение доступа

Сообщение evgeniy123 »

У меня RBAC через базу данных. Роль и правило создал .
Rule:

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


<?php

namespace budyaga\users\rbac;

use backend\models\DriversInfo;
use budyaga\users\models\User;
use Yii;
use yii\rbac\Rule;

class ActiveDriverRule extends Rule
{
    public $name = 'isActiveDriver';

    public function execute($user, $item, $params)
    {
        if (empty($user)) {
            return false;
        }

        $user_entity  = User::findOne($user);
        Yii::warning($user_entity->driverInfo->status);  // 5


        return (($user_entity->driverInfo->status) == DriversInfo::ACTIVE);   //  5==5
    }
}
?>

Controller:

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

 public function behaviors() {
        return [
            UserInfo::className(),  // Proverka na mail i pomeshcenie v header nujnoi infi
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['profile', 'register-driver', 'step-one-driver-signup'],
                'rules' => [


                    [
                        'actions'=> ['profile'],
                        'allow' => true,
                        'roles' => ['activeDriver'],
                        'denyCallback' => function ($rule, $action) {
                            Yii::$app->session->setFlash('login_first', 'ggg');  // govorim chto bi dlya nachalo zaloginilis bi
                          // return  $this->redirect('/login');

                            return $action->controller->redirect('/login');

                        }
                    ],


                ],


            ],
            
Других правил нет.

Forbidden (#403) . :(

Не могу понять почему не срабатывает правило return (($user_entity->driverInfo->status) == DriversInfo::ACTIVE);

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

return $action->controller->redirect('/login');
Не срабатывает
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Подскажите как лучше сделать ограничение доступа

Сообщение Nex-Otaku »

Забыл кое-что добавить. Чтобы проверка выполнялась, добавьте роль в список ролей по умолчанию.

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

    'components' => [
        'authManager' => [
            'class' => 'yii\rbac\DbManager',
            'defaultRoles' => ['activeDriver'],
        ],
evgeniy123
Сообщения: 401
Зарегистрирован: 2011.11.01, 17:29

Re: Подскажите как лучше сделать ограничение доступа

Сообщение evgeniy123 »

Nex-Otaku писал(а): 2018.02.25, 14:33 Забыл кое-что добавить. Чтобы проверка выполнялась, добавьте роль в список ролей по умолчанию.

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

    'components' => [
        'authManager' => [
            'class' => 'yii\rbac\DbManager',
            'defaultRoles' => ['activeDriver'],
        ],
Роль заработало , а вот редирект так и не срабатывает . .. :( Пробью по разному но результат тот же
denyCallback срабатывает только для запрещающих правил (для тех у которых параметр allow выставлен в false), у Вас же разрешающее правило
Закрыто