YII2: авторизация через базу

В данном уроке мы рассмотрим, как реализовать простую авторизацию на yii2 через базу данных. Часто, у новичков возникает множество проблем в данном вопросе, это связано с малым количеством документации на тему авторизации. Я постараюсь ответить на большинство из этих вопросов, и начнем мы с теории.

Авторизация в yii2 поддерживается через класс реализующий интерфейс \yii\web\IdentityInterface. Данным классом может быть любая модель. Создадим таблицу users с тремя полями для хранения логина и пароля пользователя.

table_users

Теперь с помощью gii — генератора создадим модель users и реализуем интерфейс IdentityInterface.

Сразу переопределим identityClass. Для этого в файле config/web.php находим такие строчки:

И значение в identityClass меняем на название нашего класса. У меня это Users.

Интерфейс IdentityInterface содержит 5 абстрактных методов которые мы должны переопределить в нашей модели:

  • Статичный метод findIdentity — возвращает объект activerecord содержащий текущего пользователя.
  • Метод getId — возвращает id текущего пользователя.
  • Методы findIdentityByAccessTokengetAuthKeyvalidateAuthKey — используются при авторизации через cooki, но в данной статье мы их использовать не будем, по этому методы можно оставить пустыми.

Теперь создадим метод контроллера actionLogin и представление где выведем форму авторизации. Код контроллера будет таким:

Код представления я приводить не буду, т.к. там стандартный вывод формы, а данная статья не об этом. А вот что происходит в контроллере разберем подробнее. Первым условием мы проверяем авторизован ли пользователь с помощью функции Yii::$app->user->isGuest. Если да, то перенаправляем на главную страницу. Ели нет, то  создаем объект модели Users и проверяем условие методами load и login. Load стандартная функция при работы с формами в yii2 а login метод описанный в модели. Посмотрим его код:

Здесь все просто: проверяем валидность данных и вызываем метод login куда передаем объект пользователя возвращаемый функцией getUser

Данная функци записывает в свойство user запись из базы данных, соответвующих текущему username и pass. И не забываем объявить свойство user вначале модели

Для проверки соответствия имени пользователя и пароля используется валидация с callback методом:

В функции validatePassword мы вызываем метод getUser который вернет null(false) если в базе данных не будет записей с необходимым условием. В этом случае добавляем ошибку валидации с текстом «Неверный пароль». Иначе валидация пройдёт успешно.

Как видите метод getUser вызывается 2а раза в разных частях приложения: При валидации и в функции login. Для того что бы приложению не пришлось делать два запроса к бд, мы выполняем sql запрос только тогда когда свойство user равно false и записываем в это свойство объект.

Авторизация готова. Теперь вы можете обращаться к свойствам пользователя через identity:

Для того что бы отменить авторизацию достаточно вызвать метод logout. Создадим метод контроллера для выхода пользователя:

 

Комментарии

  1. tzi0

    Ответить

  2. Андрей

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован.