В данном уроке мы рассмотрим, как реализовать простую авторизацию на yii2 через базу данных. Часто, у новичков возникает множество проблем в данном вопросе, это связано с малым количеством документации на тему авторизации. Я постараюсь ответить на большинство из этих вопросов, и начнем мы с теории.
Авторизация в yii2 поддерживается через класс реализующий интерфейс \yii\web\IdentityInterface. Данным классом может быть любая модель. Создадим таблицу users с тремя полями для хранения логина и пароля пользователя.
Теперь с помощью gii — генератора создадим модель users и реализуем интерфейс IdentityInterface.
Сразу переопределим identityClass. Для этого в файле config/web.php находим такие строчки:
И значение в identityClass меняем на название нашего класса. У меня это Users.
Интерфейс IdentityInterface содержит 5 абстрактных методов которые мы должны переопределить в нашей модели:
- Статичный метод findIdentity — возвращает объект activerecord содержащий текущего пользователя.
- Метод getId — возвращает id текущего пользователя.
- Методы findIdentityByAccessToken, getAuthKey, validateAuthKey — используются при авторизации через 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. Создадим метод контроллера для выхода пользователя: