Регистрация и авторизация в Symfony 4.1

Регистрацию и авторизацию будем делать с помощью прекрасного бандла — FosUserBudle. Его многие не любят, говорят, что он костыльный и плохо работает, но для блога, как по мне, самое оно. В следующем проекте мы напишем свои модули регистрации и авторизация с нуля, а сейчас — приступим.

У бандла есть документация, но она для Symfony 3.4. Поэтому в процессе некоторые шаги я буду адаптировать под нашу новенькую Symfony 4.

Сначала устанавливаем сам бандл:

Теперь удостоверься, что в файле config\bundles.php в самом конце появилась строчка:

Если нет — добавь, сохраняй и идём дальше.

Теперь нам нужно импортировать все маршруты, которые определены в FosUserBundle. Помнишь, мы разбирали с тобой тему маршрутизации? Так вот маршруты, помимо аннотаций над контроллерами, можно определять в специальном конфиге — config/routes/fos_user.yaml. Помимо определения маршруты можно импортировать из конфигов, где они уже определены. Открывай вышеназванный конфиг и добавляй туда следующее:

Если перейти в конфиг, из которого мы производим импорт, то можно обнаружить, что и в этом файле происходит импорт:

Синтаксис XML мы не разбирали, но интуитивно он понятен, только лишь чуть сложнее yaml. Если перейдёшь дальше, то увидишь маршруты, которые будут импортированы в наше приложение.

Дальше нужно явно сообщить Symfony, что возможные шаблонизаторы в нашем приложении — это twig и php. Открывай файл config\packages\framework.yaml и сразу после framework: перед secret:.. добавляй:

Чтобы ты не запутался, получится должно так:

Дальше открывай файл config\packages\security.yaml  и меняй его конфигурацию на следующую:

Теперь разбор того, что добавилось.

Устанавливает алгоритм шифрования для полей, хранящих пароли в указанной сущности — App\Entity\User. Bcrypt — это функция, позволяющая шифровать данные и хранить их в защищённом виде.

Далее:

Иерархия ролей. К этой теме мы вернёмся чуть попозже и подробно её разберём, сейчас лишь скажу, что в Symfony есть система ролей — пользователи, админы, анонимы и так далее. Можно создавать новые роли и кастомизировать их. В нашем случае у нас две роли — ROLE_USER и ROLE_ADMIN, которые мы, грубо говоря, по-другому назвали — название (алиас) и стоит в качестве ключа.

Провайдер — это та вещь, которая возвращает необходимые данные по некоторым известным данным пользователя. Мы используем провайдер, предоставленный FosUserBundl’ом.

Firewall — система защиты. Мы объявляем файрвол с именем main, и указываем для него:

anonymous: true — анонимы могут видеть форму авторизации и регистрации (насколько я понимаю)

logout: ~ — тильда означает null. Иначе говоря, разлогиниваться без повода мы не будем.

logout_on_user_change: true -если пользователь изменился, старый будет разлогиниваться. Касается устройства, с которого сидит пользователь.

form_login:
     csrf_token_generator: security.csrf.token_manager — генератор токенов — ключей текущей сессии пользователя. К ним мы вернёмся, когда будем писать свои модули регистрации и авторизации.

Секция access_control задаёт уровень доступа к роутам. Админка (мы её установили в одном из предыдущих уроков) — только для админов. Регистрация, авторизация и восстановление пароля — для всех, включая самый низкий уровень — анонимный пользователь.

Далее в директории packages проверь, есть ли файл fos_user.yaml. Если нет — создавай, если да — открывай, а потом пиши:

Этот файл задаёт основные настройки для бандла.

db_driver : orm, потому что у нас ООП-слой над реляционной БД.

firewall_name : main, мы его только что создали.

user_class : App\Entity\User.

from_email — задавай свои. Эти данные будут подставляться в письма пользователю, когда ему на почту будет приходить подтверждение регистрации или письмо со сменой пароля.

А дальше нам нужно создать сущность пользователя. Бандл уже имеет базовую сущность User, где прописаны все основные поля — логин, почта, пароль, etc. Нам остаётся только создать свою сущность User с единственным переопределённым, на текущий момент, полем — id, и унаследовать её от сущности из бандла. Тем самым мы унаследуем все основные поля и методы, а в свой дочерний класс будем дописывать только нужные нам. Создавай в директории Entity файл User.php, а затем вставляй в него следующий код:

Заметь, что наш namespace отличается от namespace из мана, линк на который я оставил выше. Стандартный namespace в Symfony4 — это App\*, а не BundleName\*, как это было в 3.4.

Класс наследуется от сущности User, определённой в Fos\UserBundle\Model\User. Если открыть файл User, который располагается по пути vendor/friendsofsymfony/user-bundle/Model/, то увидишь поля и методы, которые мы унаследовали:

Часть из них

Теперь обновляем схему, чтобы ORM создала таблицу по нашему, только что созданному, классу:

Так, ну вроде бы всё. Теперь в браузере переходи страницу /login и наблюдай:

Да, детка. Это страница авторизации.

Теперь перейди по пути /register:

А это страница регистрации. Всё отлично, всё на месте. Теперь вводи данные и нажимай кнопку Register:

Ввели данные

После нажатия на кнопку

Теперь через консоль выдадим пользователю права супер-админа. Как? С помощью команд, которые нам предоставляет бандл.

Вместо testuser подставь тот логин, который ты указал при регистрации.

Тебе должен придти подобный ответ:

Теперь нажимаем Log out:

И входим заново. Переходим на страницу /admin и видим:

Да есть же — юзер на месте, прямиком в табличке fos_user. Поздравляю, так как нам открылась страница /admin, то мы успешно стали администратором и теперь можем авторизироваться, регистрироваться, выходить и входить.

В одной из следующих статей (может в следующий вторник) я покажу тебе, как сделать восстановление пароля, как кастомизировать админку, как сделать ajax-регистрацию и авторизацию (у меня просили бахнуть ajax — получите), и в конце концом как кастомизировать эти отвратительные страницы с голой разметкой в нечто красивое и радующее глаз.