Создание, регистрация, аутентификация пользователя в Symfony
SecurityBundle
Пакет SecurityBundle предоставляет все функции аутентификации и авторизации, необходимые для защиты вашего приложения.
#Установка
composer require symfony/security-bundle
Если у вас установлен Symfony Flex, он также создаст для вас файл конфигурации security.yaml
Пользователь
Права доступа в Symfony всегда связаны с объектом пользователя. Если вам нужно защитить (части) своего приложения, вам нужно создать класс пользователя
Это класс, реализующий UserInterface:
https://github.com/symfony/symfony/blob/8.0/src/Symfony/Component/Security/Core/User/UserInterface.php
Представляет собой интерфейс, который должны реализовывать все пользовательские классы.
Чаще всего это объект Doctrine, но вы также можете использовать специальный класс пользователя Security.
Самый простой способ создать пользовательский класс — использовать команду make:user из MakerBundle:
php bin/console make:user
The name of the security user class (e.g. User) [User]:
>
Do you want to store user data in the database (via Doctrine)? (yes/no) [yes]:
>
Enter a property name that will be the unique "display" name for the user (e.g. email, username, uuid) [email]:
> username
Will this app need to hash/check user passwords? Choose No if passwords are not needed or will be checked/hashed by some other system (e.g. a single sign-on server).
Does this app need to hash/check user passwords? (yes/no) [yes]:
>
created: src/Entity/User.php
created: src/Repository/UserRepository.php
updated: src/Entity/User.php
updated: config/packages/security.yaml
Если ваш пользователь является объектом Doctrine, как в примере выше, не забудьте создать таблицы с помощью создания и запуска миграции:
При передаче --formatted в make:migration создается красивый и аккуратный файл миграции.
php bin/console make:migration
php bin/console doctrine:migrations:migrate
Загрузка пользователя: поставщик пользовательских данных
Это наиболее распространенный поставщик пользователей. Пользователи хранятся в базе данных, и поставщик пользователей использует Doctrine, чтобы извлечь их
В Symfony поставщик пользовательских данных (user provider) — это компонент, который загружает пользователей из хранилища (например, базы данных, LDAP-сервера, файла конфигурации или другого источника) на основе уникального идентификатора пользователя (email, имени пользователя и т. д.).
Он играет ключевую роль в процессе аутентификации, а также отвечает за обновление пользовательских данных в сессии, обработку функции «запомнить меня» и другие задачи.
Помимо создания объекта, команда make:user также добавляет конфигурацию поставщика пользовательских данных в вашу конфигурацию безопасности
# config/packages/security.yaml
security:
# ...
providers:
app_user_provider:
entity:
class: App\Entity\User
property: email
Поставщики пользовательских данных используются на нескольких этапах жизненного цикла обеспечения безопасности:
Загрузить пользователя по идентификатору. Эта функция также используется в некоторых других возможностях, таких как выдача себя за другого пользователя и Запомнить меня
Перезагрузить пользователя из сеанса. Провайдер «обновляет» данные о пользователе (например, повторно запрашивает свежие данные из базы), чтобы убедиться, что вся информация о пользователе актуальна (и при необходимости отменяет аутентификацию пользователя, если что-то изменилось). Подробнее об этом процессе https://symfony.com/doc/current/security.html#user_session_refresh
В Symfony есть несколько встроенных провайдеров для работы с пользователями:
Сущность-Пользователь-Провайдер. Загружает пользователей из базы данных с помощью Doctrine;
Поставщик пользователей LDAP. Загружает пользователей с сервера LDAP;
Поставщик Пользователей памяти. Загружает пользователей из файла конфигурации;
Цепочка Пользователей-Провайдеров. Объединяет двух или более провайдеров пользователей в одного. Поскольку у каждого брандмауэра есть ровно один провайдер пользователей, с помощью этой функции можно объединить несколько провайдеров в цепочку.
Встроенные провайдеры пользователей удовлетворяют наиболее распространенные потребности приложений, но вы также можете создать свой собственный пользовательский провайдер.
Подробнее об этом здесь: https://symfony.com/doc/current/security/user_providers.html#security-custom-user-provider
Источник: https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
Регистрация пользователя: хеширование паролей
Во многих приложениях требуется, чтобы пользователь входил в систему с помощью пароля. Для таких приложений SecurityBundle предоставляет функции хеширования и проверки паролей.
Сначала убедитесь, что ваш класс User реализует PasswordAuthenticatedUserInterface:
https://github.com/symfony/symfony/blob/8.0/src/Symfony/Component/Security/Core/User/PasswordAuthenticatedUserInterface.php
// src/Entity/User.php
// ...
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
class User implements UserInterface, PasswordAuthenticatedUserInterface
Затем настройте, какой хешер паролей следует использовать для этого класса. Если ваш security.yaml файл еще не был предварительно настроен, то make:user должен был сделать это за вас.
# config/packages/security.yaml
security:
# ...
password_hashers:
Теперь, когда Symfony знает, как вы хотите хешировать пароли, вы можете использовать сервис UserPasswordHasherInterface для хеширования перед сохранением данных пользователей в базе данных:
Подробнее здесь:
https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
Команда make:registration-form maker поможет вам настроить контроллер регистрации и добавить такие функции, как проверка адреса электронной почты с помощью SymfonyCastsVerifyEmailBundle.
composer require symfonycasts/verify-email-bundle
php bin/console make:registration-form
#Вы также можете хешировать пароль вручную, выполнив следующую команду:
php bin/console security:hash-password
Подробнее обо всех доступных хешерах (в том числе о конкретных хешерах) и переносе паролей читайте в разделе Хеширование и проверка паролей.
https://symfony.com/doc/current/security/passwords.html
В моем случае для регистрации не потребуется подтверждение почты и аутентификация пользователя после успешной регистрации, так как администратор сам будет регистрировать пользователя
После успешной регистрации пользователь будет перенаправлен на главную страницу приложения
php bin/console make:registration-form
Creating a registration form for App\Entity\User
Do you want to add a #[UniqueEntity] validation attribute to your User class to make sure duplicate accounts aren't created? (yes/no) [yes]:
>
Do you want to send an email to verify the user's email address after registration? (yes/no) [yes]:
> no
Do you want to automatically authenticate the user after registration? (yes/no) [yes]:
> no
What route should the user be redirected to after registration?:
[0 ] _preview_error
[1 ] _wdt_stylesheet
[2 ] _wdt
[3 ] _profiler_home
[4 ] _profiler_search
[5 ] _profiler_search_bar
[6 ] _profiler_phpinfo
[7 ] _profiler_xdebug
[8 ] _profiler_font
[9 ] _profiler_search_results
[10] _profiler_open_file
[11] _profiler
[12] _profiler_router
[13] _profiler_exception
[14] _profiler_exception_css
[15] app_home
[16] add_profile
[17] app_login
[18] app_logout
> 15
Do you want to generate PHPUnit tests? [Experimental] (yes/no) [no]:
>
updated: src/Entity/User.php
created: src/Form/RegistrationFormType.php
created: src/Controller/RegistrationController.php
created: templates/registration/register.html.twig
Success!
Next:
Make any changes you need to the form, controller & template.
Then open your browser, go to "/register" and enjoy your new form!
В сущности пользователя было добавлены функции аутентификации пользователя
Шаблон страницы регистрации пользователя будет наследовать базовый шаблон base.html.twig и будет отображаться в базовом шаблоне в рамках блока {% block content %}....{% endblock %}
{% extends 'base.html.twig' %}
{% block content %}
{{ form_start(registrationForm) }}
....
{% endblock %}
{% endblock %}
Страница регистрации пользователя будет доступна только для пользователя с определенной ролью
Страница аутентификации будет доступна для всех пользователей
Источник: https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
Аутентификация Пользователей
Во время аутентификации система пытается найти пользователя, соответствующего требованиям посетителя веб-страницы
В SecurityBundle есть множество других способов аутентификации.
Вход через форму Вход через JSON Базовый HTTP Ссылка для входа Клиентские сертификаты X.509 Удаленные пользователи Пользовательские средства аутентификации
Чтобы создать все необходимое для добавления формы входа в ваше приложение, выполните следующую команду:
Форма Входа в систему
php bin/console make:security:form-login
Choose a name for the controller class (e.g. SecurityController) [SecurityController]:
>
Do you want to generate a '/logout' URL? (yes/no) [yes]:
>
Do you want to generate PHPUnit tests? [Experimental] (yes/no) [no]:
>
created: src/Controller/SecurityController.php
created: templates/security/login.html.twig
updated: config/packages/security.yaml
Success!
Next: Review and adapt the login template: security/login.html.twig to suit your needs.
Эта команда создаст необходимый контроллер и шаблон, а также обновит конфигурацию безопасности
Шаблон страницы аутентификации пользователя будет наследовать базовый шаблон base.html.twig и будет отображаться в базовом шаблоне в рамках блока {% block content %}....{% endblock %}
{% extends 'base.html.twig' %}
{% block content %}
....
....
{% endblock %}
{% endblock %}
Можно создать форму для входа вручную, подробнее об этом здесь:
https://symfony.com/doc/current/security.html#form-login
Источник: https://symfony.com/doc/current/security.html#authenticating-users






