AccessControl запретить не авторизированным пользователям в BasController

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
metsys
Сообщения: 10
Зарегистрирован: 2014.12.17, 17:33

AccessControl запретить не авторизированным пользователям в BasController

Сообщение metsys »

Суть такая. Хочу запретить доступ неавторизированным пользователям. Не хочу писать это в каждом контроллере, а написать только в одном.
Структура у меня такая: есть frontend/controllers/BaseFrontendController, в нём есть следующий Behaviour:

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

public function behaviors() {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }
Есть frontend/modules/page/controllers/DefaultController
В нём я хочу дать доступ например только админам и менеджерам:

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

public function behaviors() {
        return ArrayHelper::merge(parent::behaviors(), [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => [User::ROLE_ADMIN, USER::ROLE_MANAGER],
                    ],
                ],
            ],
        ]);
    }
Но не работает, что я делаю не так.

Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение Neuromance »

Ну видимо не надо мерджить.

metsys
Сообщения: 10
Зарегистрирован: 2014.12.17, 17:33

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение metsys »

Ну а как тогда унаследовать правила из BaseController и добавить новые в главном контроллере Модуля?

Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение Neuromance »

Ну вы когда мерджите, то итак наследуете правила. Даёте доступ всем авторизованным)))

Попробуйте использовать array_merge.

Там у array_merge и ArrayHelper::merge разные результаты получаются

Аватара пользователя
Neuromance
Сообщения: 716
Зарегистрирован: 2011.09.06, 13:04

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение Neuromance »

PS. Хотя это был плохой совет. Не делайте так)))

Просто полностью переопределяйте behaviors. Вам же разрешить нужно т олько админам и менеджерам


Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение vitalik1183 »

mickgeek а как быть если для 3 контроллеров это необходимо, а для 2 нет?
Yii2!

mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение mickgeek »

В таком случае я бы прописывал правила в каждом контроллере и модуле отдельно, ибо это прозрачный вариант. Но можно пойти и элегантным путём - написать своё поведение, в которое будут передаваться, помимо правил, определённые параметры.

LAV45
Сообщения: 47
Зарегистрирован: 2014.01.16, 22:37

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение LAV45 »

vitalik1183 писал(а):mickgeek а как быть если для 3 контроллеров это необходимо, а для 2 нет?
https://github.com/yiisoft/yii2/blob/ma ... ol.php#L82
https://github.com/yiisoft/yii2/blob/ma ... le.php#L37

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

'components' => [
    'as beforeRequest' => [
        'class' => 'yii\filters\AccessControl',
        'rules' => [
            [
                'actions' => ['index'],
                'controllers' => ['site', 'page'],
                'allow' => true,
            ],
            [
                'actions' => ['login', 'error'],
                'allow' => true,
            ],
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
],
PS не ленитесь залезть в код и посмотреть что там понаписано ;) Там ничего страшного нет, всего лишь php код.

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение vitalik1183 »

Да вы что? Ой, а мы тут все такие сидим и не лезем в код никогда.
Ну а если у меня двестиписятчитыре экшена? Прописывать каждый?
Yii2!

2ray
Сообщения: 2
Зарегистрирован: 2015.07.13, 07:41

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение 2ray »

Как запретить ВСЁ, не авторизованным пользователям??? И выдавать только форму входа, регистрации

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение zelenin »

vitalik1183 писал(а):Да вы что? Ой, а мы тут все такие сидим и не лезем в код никогда.
Ну а если у меня двестиписятчитыре экшена? Прописывать каждый?
в конфиге аттачить поведения.

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение vitalik1183 »

Решил последовать совету коллег, в конфиг поместил:

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

//components config
],
    'as beforeRequest' => [
        'class' => yii\filters\AccessControl::className(),
        'except' => ['login'],
        'rules' => [
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
    'params' => $params,
Пишет в ответ кучу ошибок и без лейаута.
An Error occurred while handling another error:
exception 'yii\web\ForbiddenHttpException' with message 'Требуется вход.' in /home/projects/***.loc/web/vendor/yiisoft/yii2/web/User.php:431
Stack trace:
Причем проверка проходит, но как бы выдать нормальную форму для ввода доступов?
Yii2!

rkk
Сообщения: 40
Зарегистрирован: 2016.03.04, 19:33

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение rkk »

попробовал этот код

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

//components config
],
    'as beforeRequest' => [
        'class' => yii\filters\AccessControl::className(),
        'except' => ['login'],
        'rules' => [
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
    'params' => $params,
результат тот же.
vitalik1183 писал(а):Решил последовать совету коллег, в конфиг поместил:

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

//components config
],
    'as beforeRequest' => [
        'class' => yii\filters\AccessControl::className(),
        'except' => ['login'],
        'rules' => [
            [
                'allow' => true,
                'roles' => ['@'],
            ],
        ],
    ],
    'params' => $params,
Пишет в ответ кучу ошибок и без лейаута.
An Error occurred while handling another error:
exception 'yii\web\ForbiddenHttpException' with message 'Требуется вход.' in /home/projects/***.loc/web/vendor/yiisoft/yii2/web/User.php:431
Stack trace:
Причем проверка проходит, но как бы выдать нормальную форму для ввода доступов?
Собственно у меня два вопроса.
1) как запретить доступ неавторизованному пользователю на сайт и делать редиект на страницу авторизации (для ввода логина и пароля)?
2) как запретить доступ неавторизованному пользователю на отдельный модуль и делать редиект на страницу авторизации (для ввода логина и пароля)?

Вставлять проверку в каждый контроллер не интересно. Как вариант можно переопределить базовый контроллер.
Может кто-то нашел красивое решение?


zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение zelenin »

rak писал(а):переопределить базовый контроллер
для сторонних контролеров тоже?

rak
Сообщения: 2041
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение rak »

zelenin писал(а):
rak писал(а):переопределить базовый контроллер
для сторонних контролеров тоже?
да

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

Yii::$classMap['\yii\web\Controller'] = 'path/to/Controller.php';
 

Аватара пользователя
ElisDN
Сообщения: 5606
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение ElisDN »

rak писал(а):да

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

Yii::$classMap['\yii\web\Controller'] = 'path/to/Controller.php'; 
Это не "переопределить", а "переписать".

rak
Сообщения: 2041
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение rak »

ElisDN писал(а):
rak писал(а):да

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

Yii::$classMap['\yii\web\Controller'] = 'path/to/Controller.php';
Это не "переопределить", а "переписать".
хм, точно

rkk
Сообщения: 40
Зарегистрирован: 2016.03.04, 19:33

Re: AccessControl запретить не авторизированным пользователям в BasController

Сообщение rkk »

Я сделал так.
создал контроллер BaseController

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

<?php
namespace frontend\modules\account\controllers;

use Yii;
//use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;

/**
 * Site controller
 */
class BaseController extends \yii\web\Controller
{

	public function beforeAction($action)
	{
		if (Yii::$app->user->isGuest) {
			return $this->redirect('./account/login');
		}
		if (!parent::beforeAction($action)) {
			return false;
		}
		return true;
	}	
	
}
и все свои контроллеры, в которых надо, наследую от него
class DefaultController extends \frontend\modules\account\controllers\BaseController

По другому у меня никак не получилось. :(
Может кто-то свой код приведет?

Ответить