AccessControl в глобальном конфиге не работает

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: AccessControl в глобальном конфиге не работает

Сообщение Dominus »

ElisDN писал(а): 2017.09.10, 11:03
Dominus писал(а): 2017.09.10, 10:39 Как сделать их сильнее тех что в конфиге?
Правило "для всех" слабее, чем "только для залогиненных".

Имею в виду, что обычно локальные правила добавляют запреты, а не убирают.
То есть, это в конфиге прописывать все action как "для всех", а затем в контроллере делать запреты на требуемые action "только для залогиненных"

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

// backend/config/main.php
   //...
   // Доступ к админке
    'as access' => [
        'class' => 'yii\filters\AccessControl',
        'rules' => [
            [
                'actions' => ['login', 'error','test', 'logout', 'index'],
                'allow' => true,
                //'roles' => ['?'],
            ],
            /*[
                //'actions' => ['logout', 'index'],
                'allow' => true,
                'roles' => ['@'],
            ],*/
        ],
    ],
    //...
а в контроллере ограничиваем доступ к нужным actions

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

//SiteController
public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    /*[
                        'actions' => ['login', 'error', 'test'],
                        'allow' => true,
                    ],*/
                    [
                        'actions' => ['logout', 'index'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],            
        ];
    }
Правильно я понимаю? Если да, то не работает.
Нужно еще добавлять в контроллере и разрешающие правила, иначе не видит глобальных из конфига.
Так тогда, смысл в определении правил доступа в конфиге теряется.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: AccessControl в глобальном конфиге не работает

Сообщение ElisDN »

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

$config = [
    ...
    'as access' => [
        'class' => 'yii\filters\AccessControl',
        'except' => ['site/error', 'site/login'],
        'rules' => [
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
],

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

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['create'],
                    'allow' => true,
                    'roles' => ['create_post'],
                ],
            ],
        ],            
    ];
}
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: AccessControl в глобальном конфиге не работает

Сообщение Dominus »

Ну это с использованием RBAC, create_post это permission, а если без?
Используя 2 состояния, авторизован и не авторизован.

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

$config = [
    ...
    'as access' => [
        'class' => 'yii\filters\AccessControl',
        'except' => ['site/error', 'site/login'],
        'rules' => [
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
],

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

public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'except' => ['test'],
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],           
        ];
    }
При таком подходе что бы получить доступ к actionTest надо его прописывать в исключение в конфиге 'site/error', 'site/login', 'site/test'
Иначе получается следующее:

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

An Error occurred while handling another error:
exception 'yii\web\ForbiddenHttpException' with message 'Login Required' in E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\User.php:427
Stack trace:
#0 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\filters\AccessControl.php(154): yii\web\User->loginRequired()
#1 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\filters\AccessControl.php(138): yii\filters\AccessControl->denyAccess(Object(yii\web\User))
#2 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\ActionFilter.php(75): yii\filters\AccessControl->beforeAction(Object(yii\web\ErrorAction))
#3 [internal function]: yii\base\ActionFilter->beforeFilter(Object(yii\base\ActionEvent))
#4 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Component.php(557): call_user_func(Array, Object(yii\base\ActionEvent))
#5 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Controller.php(274): yii\base\Component->trigger('beforeAction', Object(yii\base\ActionEvent))
#6 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\Controller.php(164): yii\base\Controller->beforeAction(Object(yii\web\ErrorAction))
#7 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Controller.php(155): yii\web\Controller->beforeAction(Object(yii\web\ErrorAction))
#8 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Module.php(528): yii\base\Controller->runAction('error', Array)
#9 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\ErrorHandler.php(97): yii\base\Module->runAction('site/error')
#10 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\ErrorHandler.php(111): yii\web\ErrorHandler->renderException(Object(yii\web\ForbiddenHttpException))
#11 [internal function]: yii\base\ErrorHandler->handleException(Object(yii\web\ForbiddenHttpException))
#12 {main}
Previous exception:
exception 'yii\web\ForbiddenHttpException' with message 'Login Required' in E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\User.php:427
Stack trace:
#0 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\filters\AccessControl.php(154): yii\web\User->loginRequired()
#1 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\filters\AccessControl.php(138): yii\filters\AccessControl->denyAccess(Object(yii\web\User))
#2 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\ActionFilter.php(75): yii\filters\AccessControl->beforeAction(Object(yii\base\InlineAction))
#3 [internal function]: yii\base\ActionFilter->beforeFilter(Object(yii\base\ActionEvent))
#4 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Component.php(557): call_user_func(Array, Object(yii\base\ActionEvent))
#5 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Controller.php(274): yii\base\Component->trigger('beforeAction', Object(yii\base\ActionEvent))
#6 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\Controller.php(164): yii\base\Controller->beforeAction(Object(yii\base\InlineAction))
#7 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Controller.php(155): yii\web\Controller->beforeAction(Object(yii\base\InlineAction))
#8 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Module.php(528): yii\base\Controller->runAction('login', Array)
#9 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\web\Application.php(103): yii\base\Module->runAction('site/login', Array)
#10 E:\OpenServer\domains\yii2\mysite\public_html\vendor\yiisoft\yii2\base\Application.php(386): yii\web\Application->handleRequest(Object(yii\web\Request))
#11 E:\OpenServer\domains\yii2\mysite\public_html\backend\web\index.php(17): yii\base\Application->run()
#12 {main}
Если прописать так:

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

public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'except' => ['login', 'error', 'test'],
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],           
        ];
    }
То соответственно ошибок нет, но и доступа к actionTest нет.

Решает такую задачу:

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

$config = [
    ...
    'as access' => [
        'class' => 'yii\filters\AccessControl',
        'except' => ['site/error', 'site/login'],
        'rules' => [
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
],

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

public function init()
    {
        parent::init();
        Yii::$app->attachBehavior('access', [
            'class' => \yii\filters\AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['login', 'error', 'test'],
                    'allow' => true,
                ],
                [
                    'actions' => ['index', 'logout'],
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ]);
    }
    
Получен доступ для не авторизованных к login, error, test, к остальным контроллерам и экшенам как определено в конфиге.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
SaintRu
Сообщения: 88
Зарегистрирован: 2020.05.13, 11:22
Контактная информация:

Re: AccessControl в глобальном конфиге не работает

Сообщение SaintRu »

ElisDN писал(а): 2017.09.10, 14:50

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

$config = [
    ...
    'as access' => [
        'class' => 'yii\filters\AccessControl',
        'except' => ['site/error', 'site/login'],
        'rules' => [
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
],
Если так пишу, то возникает ошибка:
Unknown Property – yii\base\UnknownPropertyException
Setting unknown property: yii\filters\AccessRule::0

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

in C:\Server\localhost\shop_yii\vendor\yiisoft\yii2\BaseYii.php at line 558– yii\base\Component::__set('0', '@')
Версия Yii 2.0.35
Мой старт-ап ;) https://website39.site
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: AccessControl в глобальном конфиге не работает

Сообщение Dominus »

SaintRu писал(а): 2020.06.10, 18:05
ElisDN писал(а): 2017.09.10, 14:50

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

$config = [
    ...
    'as access' => [
        'class' => 'yii\filters\AccessControl',
        'except' => ['site/error', 'site/login'],
        'rules' => [
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
],
Если так пишу, то возникает ошибка:
Unknown Property – yii\base\UnknownPropertyException
Setting unknown property: yii\filters\AccessRule::0

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

in C:\Server\localhost\shop_yii\vendor\yiisoft\yii2\BaseYii.php at line 558– yii\base\Component::__set('0', '@')
Версия Yii 2.0.35
В контроллере как указаны rules в поведении access?

Должен быть массив:

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

    //...
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout', 'signup'],
                'rules' => [
                    // Первый массив правил
                    [
                        'actions' => ['signup'],
                        'allow' => true,
                        'roles' => ['?'],
                    ],
                    // Второй массив правил
                    [
                        'actions' => ['logout'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                    //...
                ],
            ],
            //...          
        ];
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Ответить