Закрыть доступ ко всему модулю

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Закрыть доступ ко всему модулю

Сообщение maleks »

Привет.
Без RBAC а просто ко всему что в админском модуле хочу сделать запрет кроме одного пользователя(id==100)
Так работает, но насколько это верно?

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

    'modules' => [
        'admin' => [
            'class' => 'modules\admin\Module',
            //'mode' => 'frontend',
            'as access' => [
                'class' => \yii\filters\AccessControl::class,
                'rules' => [
                    [
                        'allow' => true,
                        'matchCallback' => function ($rule, $action){
                            return !\Yii::$app->user->isGuest && 
                                    (\Yii::$app->user->id == 100);
                        },
                    ]                    
                ],                
            ],
        ],
    ],  

Тут оно походу для каждого экшена будет это проверять, а может есть как то чтобы сразу на уровне модуля не пускало?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Закрыть доступ ко всему модулю

Сообщение yiiliveext »

В модуле

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

 public function init()
    {
        parent::init();
        $user = \Yii::$app->getUser();
        if ($user->isGuest || $user->id !== 100) {
           throw new ForbiddenHttpException(Yii::t('app', 'You are not allowed to access this module'));
        }
    }    
        
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Закрыть доступ ко всему модулю

Сообщение maleks »

Может не init() а что то другое, более подходящее?
init() выполнится когда просто getModule() выполнить, а не когда запрашивается страница.

Просто помню раньше много кто оборачивал свои админские модуля в один и на последний вешался уже запрет доступа. А пример не могу найти. В коде у меня выше экшены перебирает, а в случае подмодулей, id подмодулей что ли там ...
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Закрыть доступ ко всему модулю

Сообщение yiiliveext »

maleks писал(а): 2019.11.26, 16:51 Просто помню раньше много кто оборачивал свои админские модуля в один и на последний вешался уже запрет доступа. А пример не могу найти. В коде у меня выше экшены перебирает, а в случае подмодулей, id подмодулей что ли там ...
Да нет, не все экшены, только соответствующий текущему маршруту. Перед вызовом любого экшена вызывается beforAction по всей цепочке модулей-предков вплоть до приложения, поэтому с подмодулями ваш код будет работать верно.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: Закрыть доступ ко всему модулю

Сообщение yiiliveext »

maleks писал(а): 2019.11.26, 16:51 Может не init() а что то другое, более подходящее?
init() выполнится когда просто getModule() выполнить, а не когда запрашивается страница.
Создайте для админки базовый AdminController и перенесите этот метод туда. Все контроллеры админки наследуйте от AdminController.
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Закрыть доступ ко всему модулю

Сообщение maleks »

Вспомнил как оно работает.
Сначала находит контроллер и экшен, а потом перед запуском экшена
- перебирает beforeAction() всех его модулей родителей (сверху вниз, т.е. начиная от приложения)
- потом beforeAction() самого контроллера

Поэтому в matchCallback там есть $action.

Как я изначально делал, так верно.
Ответить