Страница 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
По другому у меня никак не получилось.
Может кто-то свой код приведет?