yii2 advanced админка
-
- Сообщения: 680
- Зарегистрирован: 2017.06.21, 13:50
yii2 advanced админка
Доброго времени суток.
Как правильно сделать, скрыть элементы от всех, кроме админа.
При заходе в бекэнд, чтобы пользователь по прямой ссылке не мог получить доступ к функционалу.
Как правильно сделать, скрыть элементы от всех, кроме админа.
При заходе в бекэнд, чтобы пользователь по прямой ссылке не мог получить доступ к функционалу.
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: yii2 advanced админка
Как вариант в конфиге:
Код: Выделить всё
'as beforeRequest' => [
'class' => \yii\filters\AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['login', 'error'],
'roles' => ['?'],
],
[
'allow' => true,
'roles' => ['@']
]
],
],
Yii2!
-
- Сообщения: 680
- Зарегистрирован: 2017.06.21, 13:50
Re: yii2 advanced админка
Код поместить в advanced\backend\config\main.php ?vitalik1183 писал(а): ↑2017.07.07, 14:23 Как вариант в конфиге:Код: Выделить всё
'as beforeRequest' => [ 'class' => \yii\filters\AccessControl::className(), 'rules' => [ [ 'allow' => true, 'actions' => ['login', 'error'], 'roles' => ['?'], ], [ 'allow' => true, 'roles' => ['@'] ] ], ],
В yii2 только начал разбираться.
Re: yii2 advanced админка
Если вы определили правила RBAC, и у вас есть роль 'admin', то я в своем проекте (шаблон advanced) делал так:
Закрываем весь backend от "не админов"
в конфиге backend/config/main.php
только не закидывайте в компоненты, помещайте на один уровень с компонентами. Этот код разрешает только админам пользоваться админкой (но из правила исключены страницы 'site/login', 'site/error', 'site/logout', 'site/captcha'.
В контроллере site/login писал такой код:
а в модели LoginForm писал так:
Почему так усложнял? Потому что:
1. Не хотел показать как выглядит админка изнутри. А если человек залогинится, то его перекидывает туда и он может видеть админку. Хоть и на все действия ему падает исключение.
2. Всех обычных пользователей перекидывал на фронтенд часть - нечего им делать в админке.
Скорее всего правило "loginAdmin" можно просто заменить на 'admin'. И не создавать излишнее правило. В этой строчке мы можем проверить любого пользователя на то, имеет ли он право выполнять определенное действие или нет (даже не залогиненного):
Тут показан не весь код, еще там у меня есть класс, который следит за количеством попыток ввода логина/пароля, и, если их больше пяти, то начинает показывать капчу.
Данный код от новичка, не претендует на образцовость. В будущем код пересмотрю обязательно, не все меня устраивает. В принципе, в actionLogin можно перед тем как залогинить пользователя, просто проверить админ он или нет.
Буду рад конструктивным замечаниям.
Закрываем весь backend от "не админов"
в конфиге backend/config/main.php
Код: Выделить всё
'as access' => [
'class' => 'yii\filters\AccessControl',
'except' => ['site/login', 'site/error', 'site/logout', 'site/captcha'],
'rules' => [
[
'allow' => true,
'roles' => ['admin'],
],
],
В контроллере site/login писал такой код:
Код: Выделить всё
public function actionLogin()
{
if (!Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
if ($model->errorLogin === 'no admin') {
return $this->redirect(' тут путь к вашему фронтенду'); // всех юзеров отправлял подальше от админки
} else {
return $this->render('login', [
'model' => $model,
]);
}
}
}
Код: Выделить всё
public $errorLogin = null;
//.....
public function login()
{
if ($this->validate()) {
// login только для админов
if (Yii::$app->authManager->checkAccess($this->getUser()->id, 'loginAdmin')) {
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? Yii::$app->params['adminRemebmerMe'] : 0);
} else {
$this->errorLogin = 'no admin';
}
} else {
return false;
}
}
1. Не хотел показать как выглядит админка изнутри. А если человек залогинится, то его перекидывает туда и он может видеть админку. Хоть и на все действия ему падает исключение.
2. Всех обычных пользователей перекидывал на фронтенд часть - нечего им делать в админке.
Скорее всего правило "loginAdmin" можно просто заменить на 'admin'. И не создавать излишнее правило. В этой строчке мы можем проверить любого пользователя на то, имеет ли он право выполнять определенное действие или нет (даже не залогиненного):
Код: Выделить всё
if (Yii::$app->authManager->checkAccess($this->getUser()->id, 'loginAdmin')) { //... }
Данный код от новичка, не претендует на образцовость. В будущем код пересмотрю обязательно, не все меня устраивает. В принципе, в actionLogin можно перед тем как залогинить пользователя, просто проверить админ он или нет.
Буду рад конструктивным замечаниям.
Осторожно! Вы общаетесь с новичком
-
- Сообщения: 680
- Зарегистрирован: 2017.06.21, 13:50
Re: yii2 advanced админка
Спасибоgirmate писал(а): ↑2017.07.07, 17:51 Если вы определили правила RBAC, и у вас есть роль 'admin', то я в своем проекте (шаблон advanced) делал так:
Закрываем весь backend от "не админов"
в конфиге backend/config/main.phpтолько не закидывайте в компоненты, помещайте на один уровень с компонентами. Этот код разрешает только админам пользоваться админкой (но из правила исключены страницы 'site/login', 'site/error', 'site/logout', 'site/captcha'.Код: Выделить всё
'as access' => [ 'class' => 'yii\filters\AccessControl', 'except' => ['site/login', 'site/error', 'site/logout', 'site/captcha'], 'rules' => [ [ 'allow' => true, 'roles' => ['admin'], ], ],
В контроллере site/login писал такой код:а в модели LoginForm писал так:Код: Выделить всё
public function actionLogin() { if (!Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { return $this->goBack(); } else { if ($model->errorLogin === 'no admin') { return $this->redirect(' тут путь к вашему фронтенду'); // всех юзеров отправлял подальше от админки } else { return $this->render('login', [ 'model' => $model, ]); } } }
Почему так усложнял? Потому что:Код: Выделить всё
public $errorLogin = null; //..... public function login() { if ($this->validate()) { // login только для админов if (Yii::$app->authManager->checkAccess($this->getUser()->id, 'loginAdmin')) { return Yii::$app->user->login($this->getUser(), $this->rememberMe ? Yii::$app->params['adminRemebmerMe'] : 0); } else { $this->errorLogin = 'no admin'; } } else { return false; } }
1. Не хотел показать как выглядит админка изнутри. А если человек залогинится, то его перекидывает туда и он может видеть админку. Хоть и на все действия ему падает исключение.
2. Всех обычных пользователей перекидывал на фронтенд часть - нечего им делать в админке.
Скорее всего правило "loginAdmin" можно просто заменить на 'admin'. И не создавать излишнее правило. В этой строчке мы можем проверить любого пользователя на то, имеет ли он право выполнять определенное действие или нет (даже не залогиненного):Тут показан не весь код, еще там у меня есть класс, который следит за количеством попыток ввода логина/пароля, и, если их больше пяти, то начинает показывать капчу.Код: Выделить всё
if (Yii::$app->authManager->checkAccess($this->getUser()->id, 'loginAdmin')) { //... }
Данный код от новичка, не претендует на образцовость. В будущем код пересмотрю обязательно, не все меня устраивает. В принципе, в actionLogin можно перед тем как залогинить пользователя, просто проверить админ он или нет.
Буду рад конструктивным замечаниям.
Посмотрю в действие, и если что предложу улучшения.
Re: yii2 advanced админка
Да, только в следующий раз не тяните портянку с предыдущим ответом. Достаточно одного предложения и многоточие, а если отвечаете на предыдущее высказывание, то можно и не цитировать. Здесь не любят портянки.
Осторожно! Вы общаетесь с новичком
Re: yii2 advanced админка
Вот это (в actionLogin):
попробуйте заменить на
на роль 'admin'. И не нужно новые правила создавать. Если он может админить, значит пускаем, если нет - то нет. Ну или дополнительные проверки, какие захотите.
Код: Выделить всё
if (Yii::$app->authManager->checkAccess($this->getUser()->id, 'loginAdmin')) { //... }
Код: Выделить всё
if (Yii::$app->authManager->checkAccess($this->getUser()->id, 'admin')) { //... }
Осторожно! Вы общаетесь с новичком
Re: yii2 advanced админка
И для Вашей темы есть отдельный подраздел: viewforum.php?f=35
А Вы в общий написали.
А Вы в общий написали.
Осторожно! Вы общаетесь с новичком
-
- Сообщения: 680
- Зарегистрирован: 2017.06.21, 13:50
Re: yii2 advanced админка
Понял, спасибо.