
Пишем систему авторизации на PHP
Сегодня мы напишем авторизацию пользователя на сайте. Вся система будет работать следующим образом: пользователь вводит логин и пароль на форме входа, если они правильные – в Cookie браузера будет установлена специальная запись – auth token (авторизационный токен). При дальнейших запросах на сервер этот токен будет проверяться и если он будет правильным, то пользователь считается авторизованным.
Первым делом решаем, что страница с формой логина и пароля будет находиться по адресу http://myproject.loc/users/login. Создаём соответствующий роут.
src/routes.php
Код доступен только после покупки курса ООП в PHP.
После этого добавляем новый экшен в контроллере.
src/MyProject/Controllers/UsersController.php
Код доступен только после покупки курса ООП в PHP.
И, наконец, создаём шаблон с формой для этого экшена.
templates/users/login.php
Код доступен только после покупки курса ООП в PHP.
Теперь можно зайти в браузер и убедиться, что форма открывается.
Теперь нам нужно добавить обработку отправленной формы и добавить в модели пользователя метод для логина.
src/MyProject/Models/Users/User.php
Код доступен только после покупки курса ООП в PHP.
Обратите вниимание – при успешном входе auth token пользователя в базе обновляется – все его предыдущие сессии станут недействительными.
src/MyProject/Controllers/UsersController.php
Код доступен только после покупки курса ООП в PHP.
Проверяем, что ошибки корректно обрабатываются. Для этого пробуем вводить некорректные логин и пароль, а также отправлять форму с пустыми полями.
Отлично, теперь нужно добавить обработку ситуации, когда логин и пароль верны и метод login в модели User вернул нам пользователя.
Создадим специальный сервис, который будет работать с пользовательскими сессиями через Cookie. Назовём его UsersAuthService.
src/MyProject/Services/UsersAuthService.php
Код доступен только после покупки курса ООП в PHP.
А теперь мы можем использовать его для удобного создания нужной Cookie в контроллере.
src/MyProject/Controllers/UsersController.php
Код доступен только после покупки курса ООП в PHP.
Теперь откроем консоль разработчика в Google Chrome и введем правильные логин и пароль. Видим, что нас перекинуло на главную страницу нашего блога, и что была установлена Cookie с именем token.
Теперь нам нужно научиться передавать пользователя во View. Согласитесь, пользователь нам понадобится почти на каждой странице сайта, в каждом экшене. И будет неудобно каждый раз при рендеринге шаблона прокидывать пользователя:
src/MyProject/Controllers/MainController.php
Код доступен только после покупки курса ООП в PHP.
Поэтому мы сделаем во View возможность добавлять переменные еще перед рендерингом, вот так:
src/MyProject/View/View.php
Код доступен только после покупки курса ООП в PHP.
И теперь мы можем в контроллерах прямо в конструкторах задать нужные переменные.
src/MyProject/Controllers/MainController.php
Код доступен только после покупки курса ООП в PHP.
И добавить в шапке сайта (в шаблонах) вывод пользователя, если он был передан во View:
templates/header.php
Код доступен только после покупки курса ООП в PHP.
Обновим теперь страничку и увидим приветствие.
Если мы сейчас перейдём на страницу со статьёй, то увидим, что система просит нас залогиниться.
Это потому что мы в контроллере статей не прокинули пользователя во View. Давайте добавим тот же код, что и в конструкторе MainController.
src/MyProject/Controllers/ArticlesController.php
Код доступен только после покупки курса ООП в PHP.
Обновим страничку, и увидим, что теперь пользователь был передан в шаблон.
Прежде чем добавлять этот же код в контроллер пользователей давайте подумаем – ведь этот код будет одинаковым во всех трех контроллерах. Так давайте же создадим отдельный абстрактный контроллер, куда поместим этот код, а все наши контроллеры просто от него отнаследуем.
src/MyProject/Controllers/AbstractController.php
Код доступен только после покупки курса ООП в PHP.
Обратите внимание, свойства user и view теперь с типом protected – они будут доступны в наследниках. Ну а теперь нам достаточно просто отнаследоваться в наших контроллерах от этого класса и можно удалить в них конструкторы и свойства view и user – они будут унаследованы от AbstractController. Это существенно упростит их код.
src/MyProject/Controllers/MainController.php
Код доступен только после покупки курса ООП в PHP.
src/MyProject/Controllers/ArticlesController.php
Код доступен только после покупки курса ООП в PHP.
src/MyProject/Controllers/UsersController.php
Код доступен только после покупки курса ООП в PHP.
Теперь можно пройтись по всем страничкам сайта и убедиться, что всё по-прежнему работает. Если теперь нам нужно будет добавить какой-то функционал для всех контроллеров, то мы просто сделаем это в AbstractController.
Ну вот и всё – наша система авторизации готова! Разумеется, есть еще несколько вещей, которые нужно сделать. Их вы реализуете самостоятельно в домашнем задании.
Домашнее задание
Читайте также
-
Добавляем статьи в блог на PHPПишем систему для добавления статей в блог на PHP...
-
Редактируем статьи в блоге на PHPПишем код для изменения статей на сайте на PHP в ООП-стиле....
-
Задание для самостоятельной работы – доводим блог до умаУрок для самоподготовки - включаем фантазию и получаем удово...
-
Система активации пользователей по email на PHPПишем систему активации пользователей по email на PHP7 в объ...
-
Отправка email в PHP: настройка OpenServerНастраиваем SMTP в OpenServer для отправки email-сообщений с...





Комментарии (12)
Можешь кинуть код реализации ?
Код экшена? Или вообще весь?)
У меня почему-то не получается разлогинить пользователя, я пытаюсь удалить куки с токеном и после этого вызвать getUserByToken() что бы "удалить" пользователя (null), но безуспешно. Или это по другому делается?
Просто удаляйте куки и перенаправляйте на другую страницу.
так при этом же остается объект пользователя на всех страницах, то есть любой контроллер да и вьюхи будут его видеть и это = что он все еще в системе (у нас же все проверки в шаблонах и контроллерах на !empty($user)). Разве не так?
Он у вас там берется из cookie. Не будет куки - не будет и юзера.
Header:
UsersController:
routes:
Отлично!
ну и конечно роут '~^users/exit~' => [\MyProject\Controllers\UsersController::class, 'exit'],
Отлично!
После успешного логина почему то куки принимают вид:
Set-Cookie: token=3%3A; path=/; HttpOnly
Почему токен так задается не правильно? Из-за этого у меня не определяет юзера и соответственно не работает ничего.
class UsersAuthService:
Models/User.php:
UsersController:
Ну что же вы, на 30-ом уроке такие вопросы задавать неуместно. Пора уже самостоятельно находить такие ошибки :) Используйте дебаггер и смотрите, какие куки отправляются с сервера, где и как они формируются.