Страница 1 из 2

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

Добавлено: 2015.07.27, 15:46
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],
                    ],
                ],
            ],
        ]);
    }
Но не работает, что я делаю не так.

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

Добавлено: 2015.07.27, 15:48
Neuromance
Ну видимо не надо мерджить.

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

Добавлено: 2015.07.27, 15:56
metsys
Ну а как тогда унаследовать правила из BaseController и добавить новые в главном контроллере Модуля?

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

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

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

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

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

Добавлено: 2015.07.27, 16:07
Neuromance
PS. Хотя это был плохой совет. Не делайте так)))

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

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

Добавлено: 2015.07.27, 16:20
mickgeek

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

Добавлено: 2015.07.27, 17:34
vitalik1183
mickgeek а как быть если для 3 контроллеров это необходимо, а для 2 нет?

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

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

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

Добавлено: 2015.07.28, 00:03
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 код.

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

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

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

Добавлено: 2015.07.28, 10:44
2ray
Как запретить ВСЁ, не авторизованным пользователям??? И выдавать только форму входа, регистрации

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

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

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

Добавлено: 2015.07.30, 12:37
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:
Причем проверка проходит, но как бы выдать нормальную форму для ввода доступов?

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

Добавлено: 2017.01.05, 17:12
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) как запретить доступ неавторизованному пользователю на отдельный модуль и делать редиект на страницу авторизации (для ввода логина и пароля)?

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

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

Добавлено: 2017.01.05, 17:41
rak
переопределить базовый контроллер

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

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

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

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

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

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

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

Добавлено: 2017.01.05, 20:20
ElisDN
rak писал(а):да

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

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

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

Добавлено: 2017.01.05, 21:27
rak
ElisDN писал(а):
rak писал(а):да

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

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

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

Добавлено: 2017.01.10, 15:57
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

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