Помогите новичку разобраться с авторизацией в админке

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
atlant5.com
Сообщения: 3
Зарегистрирован: 2015.10.17, 14:12

Помогите новичку разобраться с авторизацией в админке

Сообщение atlant5.com »

Добрый день!

Предыстория:
Начинаю изучать yii2, ранее говнокодил, потом был перерыв около 2 лет. сейчас жизненно необходимо самостоятельно во все вникнуть.
Пробежался по документации, пообщался с некоторыми кодерами, hello world написал и даже лендинг натянул на фреймворк. Написал какую то авторизацию-велосипед в админке, но работает оно мягко говоря не так как должно.

Сейчас изучение уперлось в осознании того как сделать авторизацию в админке.

Как хочу организовать админку:
1. Контроллер "LoginController.php" - отвечает за авторизацию в админке. Запускается по умолчанию. выводит форму логин/пароль, проверяет их правильность.

2. Если логин/пароль верные, то перенаправляет на контроллер(ы) админки. Минимум 1 админ-контроллер "AdminController.php" где уже будет интерфейс управления контентом.

3. До тех пор пока сессия сохраняется, человек работает в админке. Если он захочит принудительно зайти на страницу авторизации повторно, то его перекидывает в админку.

4. Как только сессия закончилась или была получена команда logout, то со всех админ контроллеров его будет перекидывать на авторизацию.

вроде по логике всё нормально.

СРАЗУ хочу предотвратить заявление - а вот готовое уже есть решение и встроенное или еще какое-то:
- такое не подойдет. Цель научиться, а не смотреть с недопониманием как оно работает. У меня и так с трудом складывается в голове как оно работает и откуда какие зависимости подтягивает и в каком порядке, хотя в документации все читал, а сейчас пришло время делать.
- гугл в помощь - гугл уже помог чем мог. Далеко не сразу здесь тему создал. Пытался как мог найти выход сам.

И так что имею:
Скриншот структуры приложения + конфиг: http://joxi.ru/krDxMXOIQX3Zrp
LoginController.php : http://joxi.ru/ZrJpMlXsqlNp2j

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

<?php
/**
 * Created by PhpStorm.
 * User: evgeny
 * Date: 09.11.15
 * Time: 12:14
 */

namespace backend\controllers;

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

/**
 * User controller
 */
class LoginController extends Controller
{
    public function actionLogin()
    {
        // строка генерирует хэш пароля админа, ну или любой комбинации символов в ('admin');
        //return Yii::$app->security->generatePasswordHash('admin');

        // проверка правильности валидации формы (заполнено или нет), проверяет правила из rules
        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()){
            return $this->goHome();
        }
        else {
            return $this->render('login', [
                'model' => $model
            ]);
        }
    }

    // функция выхода из сессии
    public function actionLogout()
    {
        Yii::$app->user->logout();
        return $this->goHome();
    }


    public function actionIndex()
    {
        return $this->render('index');
    }
    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

}
models/Login.php

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

<?php
/**
 * Created by PhpStorm.
 * User: evgeny
 * Date: 08.11.15
 * Time: 21:45
 */

namespace backend\models;

use Yii;
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
use yii\base\NotSupportedException;

class Login extends ActiveRecord implements IdentityInterface
{
    public static function tableName()
    {
        return '{{%users}}';
    }

    public function attributeLabels(){
        return [
            'title' => 'Заголовок страницы',
            'seotags' => 'СЕО теги',
            'seodescript' => 'СЕО описание',
            'content' => 'Содержимое страницы',
        ];
    }

    // если модель называется так же как и таблица, то указывать на таблицу не обязательно
    /*    public static function tableName(){
            return 'pages';
        }*/

    public function rules(){
        return [
            [['title', 'content'], 'required']
        ];
    }

    // получает данные по ID
    public static function findIdentity($id){
        return self::findOne($id);
    }

    /**
     * получает по токену инфу. для API используется. Долж
     * @inheritdoc
     */
    public static function findIdentityByAccessToken($token, $type = null)
    {
        throw new NotSupportedException('findIdentityByAccessToken is not implemented.');
    }

    /**
     * получает ID авторизованного пользователя (админа) для авторизации
     * @inheritdoc
     */
    public function getId()
    {
        return $this->getPrimaryKey();
    }

    /**
     * для API (скорее всего)
     * @inheritdoc
     */
    public function getAuthKey()
    {
        return $this->auth_key;
    }

    /**
     * проверка вышеописанного auth_key
     * @inheritdoc
     */
    public function validateAuthKey($authKey)
    {
        return $this->getAuthKey() === $authKey;
    }



} 

models/LoginForm.php - хз как ее задействовать

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

<?php
/**
 * Created by PhpStorm.
 * User: evgeny
 * Date: 08.11.15
 * Time: 21:42
 */


namespace backend\models;

use Yii;
use yii\base\Model;
use backend\models\Users;


class LoginForm extends Model {
    public $login; //объявляем переменную login
    public $password;
    protected $_user; // юзера которого мы нашли в бд записываем в эту переменную

    /**
     * Правила проверки
     * @inheritdoc
     */
    public function rules(){

        return [
            [['login', 'password'], 'required'],
            ['login', 'userValidate'],

        ];
    }

    // проверяем наличие такого логина
    public function userValidate()
    {
        $this->_user = Login::find()->where('login = :login ', [':login' => $this->login])->one();
        if ($this->_user === null){
            $this->addError('login', 'Пользователь не найден');
        }
        // если все таки нашелся такой юзер, то проверяем соответствие пароля встроенной функцией, сопоставляя пароль из POST и пароль из найденного по логину юзера
        elseif (Yii::$app->security->validatePassword($this->password, $this->_user->password) === false) {
            // указываем к полю password ошибку 'пароль не верен'
            $this->addError('password', 'Пароль не верен');
        }


    }

    public function login(){
        // проверяем правила rules, если валидация пройдена
        if ($this->validate()){
            //если валидация прошла по rules, то настраивается сессия для аюзера на XXX сек.
            if (Yii::$app->user->login($this->_user, 20)){
                return true;
            }
            // если сессию настроить не удалось
            else {
                $this->addError('login', 'Авторизация не удалась по ну очень редкой причине :-) ');
            }
        }
        // после первого ретурна функция прекращает выполнение и до нижнего ретурна дело не доходит
        return false;
    }


} 
При заходе в админку вижу это:
http://joxi.ru/52aRl7kFLqBOA0

А по идее должно быть вот это, а доступ к предыдущему "Congratulations" должен быть закрыт
http://joxi.ru/BA0RoPpFGXdVmy

Возможно как то behavirous надо настроить. Что делать то?
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Помогите новичку разобраться с авторизацией в админке

Сообщение vitalik1183 »

в чем сложность установить дебагер, создать новое приложение, поставить бряку и отследить весь процесс?
Yii2!
atlant5.com
Сообщения: 3
Зарегистрирован: 2015.10.17, 14:12

Re: Помогите новичку разобраться с авторизацией в админке

Сообщение atlant5.com »

Невероятным образом при помощи этого:

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

class LoginController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
               // 'only' => ['login', 'logout', 'signup'],
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['login'],
                        'roles' => ['?'],
                    ],
                    [
                        'allow' => true,
                        'actions' => ['logout', 'index'],
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }
    
    . . .
}
Оно заработало.

Но не совсем так как хочу.

Когда я вхожу в админку, он запускает не тот контроллер.
Для авторизованного юзера должен запускаться другой контроллер
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: Помогите новичку разобраться с авторизацией в админке

Сообщение nickdenry »

Для авторизованного юзера должен запускаться другой контроллер
Присоединяюсь к вопросу про редирект (или путь по-умолчанию) после логина. Как реализовать?
Ответственные программисты с высоким уровнем технического долга (c)
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Помогите новичку разобраться с авторизацией в админке

Сообщение maleks »

ну вот у вас сейчас прописано:

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

return $this->goHome(); 
так оно и работает. Меняйте на то что вам надо.
Ответить