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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
zhanbolat18
Сообщения: 17
Зарегистрирован: 2017.09.07, 08:53

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

Сообщение zhanbolat18 »

Добрый день, форумчане.
Я недавно узнал, что фильтр контроля доступа (AccessControl) можно вынести из behaviours в конфиг. Так как в админке почти во всех контроллерах контроль доступа идентичные, решил перенести. выглядит следующим образом:

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

    'as access' => [
        'class' => 'yii\filters\AccessControl',
        'rules' => [
            [
                'actions' => ['site/info','site/error','site/index'],
                'allow' => true,
            ],
            [
                'actions' => ['site/login'],
                'allow' => true,
                'roles' => ['?']
            ],
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
        'denyCallback' => function () {
            return \Yii::$app->response->redirect(['site/login']);
        },
    ],
Но оно не работает. При разлогиненном состоянии если в урл написать контроллер и экшн, то он спокойно проходит и экшн выбрасывает исключение. Можете подсказать, в чем я ошибся. В контроллере вообще убрал метод behaviours.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

Привет, у меня вот так сработало:
backend\config\main.php

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

return [
    'id' => 'app-backend',
    'language' => 'en-US',
    'homeUrl' => '/admin',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'backend\controllers',
    'defaultRoute' => 'site/index',
    'bootstrap' => ['log'],
    'modules' => [],
    'components' => [
        'request' => [
            'csrfParam' => '_csrf-backend',
            'baseUrl' => '/admin',
        ],
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
        ],
        'session' => [
            // this is the name of the session cookie used for login on the backend
            'name' => 'advanced-backend',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
    ],
    // Доступ к админке
    'as AccessBehavior' => [
        'class' => 'yii\filters\AccessControl',
        'rules' => [
            [
                'actions' => ['login', 'error'],
                'allow' => true,
                //'roles' => ['?'],
            ],
            [
                //'actions' => ['logout', 'index'],
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
    'params' => $params,
];
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
zhanbolat18
Сообщения: 17
Зарегистрирован: 2017.09.07, 08:53

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

Сообщение zhanbolat18 »

Привет. Я так пробовал, и пробовал на событие "on beforeAction", тоже не сработало((((
zhanbolat18
Сообщения: 17
Зарегистрирован: 2017.09.07, 08:53

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

Сообщение zhanbolat18 »

У меня был родительский контроллер, грешил на него, может что то не то переопределил, отнаследовался от yii\web\Controller, тоже не помог. Проблема осталось.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

У меня версия фреймворка 2.0.13-dev
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
zhanbolat18
Сообщения: 17
Зарегистрирован: 2017.09.07, 08:53

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

Сообщение zhanbolat18 »

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

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

Сообщение Dominus »

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

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

Сообщение Dominus »

Только что проверил на 2.0.12 тоже норм работает.
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
zhanbolat18
Сообщения: 17
Зарегистрирован: 2017.09.07, 08:53

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

Сообщение zhanbolat18 »

Написал

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

    
    'as access' => [
        'class' => 'yii\filters\AccessControl',
        'rules' => [
            'allow' => false,
        ],
    ],
    
Он вроде никого никогда вообще не должен пускать. Но пускает, а конфиг не работает.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

zhanbolat18 писал(а): 2017.09.07, 12:43 Написал

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

    
    'as access' => [
        'class' => 'yii\filters\AccessControl',
        'rules' => [
            'allow' => false,
        ],
    ],
    
Он вроде никого никогда вообще не должен пускать. Но пускает, а конфиг не работает.
Такое ощущение, что у вас конфиг не цепляется. Этот код должен вызывать ошибку.

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

Call to a member function allows() on a non-object
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
zhanbolat18
Сообщения: 17
Зарегистрирован: 2017.09.07, 08:53

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

Сообщение zhanbolat18 »

Спасибо большое! Нашелся решение. В Админке были несколько поддомены. Я выставил не туда)))))) Эххх, если бы руки были из плеч... ))))
zhanbolat18
Сообщения: 17
Зарегистрирован: 2017.09.07, 08:53

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

Сообщение zhanbolat18 »

Еще в этом духе, не подскажете, могу ли я в каком то контроллере, дополнить этот же access, еще своими rules, типа добавить вниз. И как лучше это сделать?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

zhanbolat18 писал(а): 2017.09.07, 14:00 Еще в этом духе, не подскажете, могу ли я в каком то контроллере, дополнить этот же access, еще своими rules, типа добавить вниз. И как лучше это сделать?
Пробуйте так:

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

// TestController
public function init()
    {
        parent::init();
        Yii::$app->attachBehavior('access', [
            'class' => \yii\filters\AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['index'],
                    'allow' => true,
                ],
            ],
        ]);
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

zhanbolat18 писал(а): 2017.09.07, 14:00 Еще в этом духе, не подскажете, могу ли я в каком то контроллере, дополнить этот же access, еще своими rules, типа добавить вниз. И как лучше это сделать?
Да, как обычно объявляете свой у контроллера или модуля в behaviors().
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

ElisDN писал(а): 2017.09.10, 10:03 Да, как обычно объявляете свой у контроллера или модуля в behaviors().
Как обычно не получается, не пускает глобальный в конфиге, поэтому в init через attachBehavior
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

Dominus писал(а): 2017.09.10, 10:10 Как обычно не получается, не пускает глобальный в конфиге, поэтому в init через attachBehavior
Если все локальные правила сильнее глобальных, то получается.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

Это из разряда глобальные стали локальными, а локальные глобальными?))
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

Dominus писал(а): 2017.09.10, 10:28 Это из разряда глобальные стали локальными, а локальные глобальными?))
Локальные - у конкретного контроллера или модуля. Глобальные - у всего приложения.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

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

Сообщение Dominus »

Ну вот например

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

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

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

//SiteController
public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'error', 'test'],
                        'allow' => true,
                    ],
                    /*[
                        'actions' => ['logout', 'index'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],*/
                ],
            ],            
        ];
    }
Как сделать их сильнее тех что в конфиге?

У меня получилось так:

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

//SiteController
public function init()
    {
        parent::init();
        Yii::$app->attachBehavior('access', [
            'class' => \yii\filters\AccessControl::className(),
            'rules' => [
                [
                    'actions' => ['login', 'error', 'test'],
                    'allow' => true,
                ],
            ],
        ]);
    }
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

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

Сообщение ElisDN »

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

Имею в виду, что обычно локальные правила добавляют запреты, а не убирают.
Ответить