yii2 advanced админка

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
trueorfalse
Сообщения: 680
Зарегистрирован: 2017.06.21, 13:50

yii2 advanced админка

Сообщение trueorfalse »

Доброго времени суток.
Как правильно сделать, скрыть элементы от всех, кроме админа.
При заходе в бекэнд, чтобы пользователь по прямой ссылке не мог получить доступ к функционалу.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: yii2 advanced админка

Сообщение vitalik1183 »

Как вариант в конфиге:

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

'as beforeRequest' => [
        'class' => \yii\filters\AccessControl::className(),
        'rules' => [
            [
                'allow' => true,
                'actions' => ['login', 'error'],
                'roles' => ['?'],
            ],
            [
                'allow' => true,
                'roles' => ['@']
            ]
        ],
    ],
Yii2!
trueorfalse
Сообщения: 680
Зарегистрирован: 2017.06.21, 13:50

Re: yii2 advanced админка

Сообщение trueorfalse »

vitalik1183 писал(а): 2017.07.07, 14:23 Как вариант в конфиге:

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

'as beforeRequest' => [
        'class' => \yii\filters\AccessControl::className(),
        'rules' => [
            [
                'allow' => true,
                'actions' => ['login', 'error'],
                'roles' => ['?'],
            ],
            [
                'allow' => true,
                'roles' => ['@']
            ]
        ],
    ],
Код поместить в advanced\backend\config\main.php ?
В yii2 только начал разбираться.
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: yii2 advanced админка

Сообщение girmate »

Если вы определили правила RBAC, и у вас есть роль 'admin', то я в своем проекте (шаблон advanced) делал так:

Закрываем весь 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', 'site/error', 'site/logout', 'site/captcha'.

В контроллере 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,
                ]);
            }
        }
    }
а в модели LoginForm писал так:

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

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 можно перед тем как залогинить пользователя, просто проверить админ он или нет.

Буду рад конструктивным замечаниям.
Осторожно! Вы общаетесь с новичком ;)
trueorfalse
Сообщения: 680
Зарегистрирован: 2017.06.21, 13:50

Re: yii2 advanced админка

Сообщение trueorfalse »

girmate писал(а): 2017.07.07, 17:51 Если вы определили правила RBAC, и у вас есть роль 'admin', то я в своем проекте (шаблон advanced) делал так:

Закрываем весь 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', 'site/error', 'site/logout', 'site/captcha'.

В контроллере 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,
                ]);
            }
        }
    }
а в модели LoginForm писал так:

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

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 можно перед тем как залогинить пользователя, просто проверить админ он или нет.

Буду рад конструктивным замечаниям.
Спасибо
Посмотрю в действие, и если что предложу улучшения.
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: yii2 advanced админка

Сообщение girmate »

Да, только в следующий раз не тяните портянку с предыдущим ответом. Достаточно одного предложения и многоточие, а если отвечаете на предыдущее высказывание, то можно и не цитировать. Здесь не любят портянки.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: yii2 advanced админка

Сообщение girmate »

Вот это (в actionLogin):

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

if (Yii::$app->authManager->checkAccess($this->getUser()->id, 'loginAdmin')) { //...  }
попробуйте заменить на

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

if (Yii::$app->authManager->checkAccess($this->getUser()->id, 'admin')) { //...  }
на роль 'admin'. И не нужно новые правила создавать. Если он может админить, значит пускаем, если нет - то нет. Ну или дополнительные проверки, какие захотите.
Осторожно! Вы общаетесь с новичком ;)
Аватара пользователя
girmate
Сообщения: 1534
Зарегистрирован: 2015.10.27, 12:52

Re: yii2 advanced админка

Сообщение girmate »

И для Вашей темы есть отдельный подраздел: viewforum.php?f=35
А Вы в общий написали.
Осторожно! Вы общаетесь с новичком ;)
trueorfalse
Сообщения: 680
Зарегистрирован: 2017.06.21, 13:50

Re: yii2 advanced админка

Сообщение trueorfalse »

Понял, спасибо.
Ответить