Symfony, user registration
Регистрация, часть 1
Symfony, в отличии от некоторых других фреймворков, не имеет функционала авторизации/регистрации из коробки. Конечно такие пробелы были быстро закрыты энтузиастами (которые, к слову, входят в число разработчиков Symfony) библиотекой FOSUserBundle. Не смотря на это мы пойдем во все тяжкие и будем делать все вручную, ну а кому интересно как ее подключить – есть инструкция.
Для реализации функционала регистрации нам потребуется securityBundle,
подключим его с помощью алиаса security - composer require security
.
Данный бандл представляет из себя очень обширный набор настроек безопасности вашего приложения.
Например, указание алгоритма шифрования паролей, access_control для доступа по ролям,
провайдеры данных и многое другое. Мы еще вернемся к безопасность, когда будем настраивать доступы.
Конкретно сейчас, после подключения рецепта, нам стоит сразу же указать алгоритм шифрования паролей.
Для этого в файл config=>packages=>security.yaml
нужно добавить:
encoders:
App\Entity\User:
algorithm: bcrypt
cost: 12
Теперь генерируем сущность User.
В консоли пишем php bin/console make:entity User
и
присваиваем ему набор свойств. * Внимательно проверьте корректность ввода данных!
Свойства класса User:
- - id (генерируется по умолчанию, поэтому пропускаем);
- - email (string, 255, not null);
- - password (string, 255, not null);
- - plainPassword (string, 255, not null) - для временного хранения пароля;
- - roles (json_array, not null);
- - confirmationCode (string, 20, null) - код подтверждения в email;
- - is_confirmed (boolean, not null) - активирован юзер или нет.
Вы вольны делать класс User таким, каким хочется, но есть одно требование - необходимо имплементировать UserInterface от которого мы получим стандартные методы – getUsername, getSalt, eraseCredentials и т.д. Так что дописываем implements UserInterface, добавляем соответствующий namespace и методы из интерфейса. Должно получиться так:
Если у вас phpStorm - не мучайтесь и не переносите методы UserInterface в класс User руками.
CTRL + I
в классе User,
выберите методы интерфейса и нажмите OK.
Теперь осталось подгогнать методы и свойства класса User под наши нужды.
-
Пользователи по умолчанию будут иметь роль, не поверите,
пользователя. Реализуем это с помощью константы
ROLE_USER
. Добавляем в начало класса:public const ROLE_USER = 'ROLE_USER';
public function __construct() { $this->roles = [self::ROLE_USER]; }
getRoles
:public function getRoles() { return [ 'ROLE_USER' ]; }
-
Унаследованный от UserInterface метод eraseCredentials очищает введенные данные пользователя,
с его помощью мы будем обнулять свойство $plainPassword (использование которого по сути является
рекомендацией). Список шагов будет таким:
- - в форме используем не $password, а $plainPassword;
- - получаем пароль от пользователя в виде простого текста;
- - передаем текст шифровальщику и присваиваем кодированный пароль свойству $password;
- - на этапе аутентификации вызывается метод eraseCredentials() и присваивает $plainPassword значение null.
public function eraseCredentials() { $this->plainPassword = null; }
-
plainPassword, как уже было указано, потребуется для временного сохранения пароля
и в базу данных записывать его не имеет смысла. Полностью удаляем над ним блок аннотаций,
чтобы не смущать доктрину.
private $plainPassword;
-
Возврат метода getSalt меняем на null просто потому что он имплементировался, а использовать его не будем.
public function getSalt() { return null; }
-
В getUsername возвращаем
$this->email
. Это в нашем случае, а вообще возвращаем то что будет нужно для авторизации. Например login или username;public function getUsername() { return $this->email; }
С классом User покончено. Теперь просто выполним миграции.
Первая команда вычислит разницу между БД и имеющимися классами,
а вторая выполнит миграцию.
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate