Как происходит аутентификация в Symfony на примере из документации?

В Symfony аутентификация осуществляется с помощью компонента Security. Он предоставляет мощную и гибкую систему аутентификации, которая позволяет работать с различными источниками пользовательских данных, такими как база данных, API и другие.

Процесс аутентификации в Symfony начинается с отправки пользователем запроса на аутентификацию. Когда запрос достигает вашего приложения, компонент Security запускает цепочку фильтров и шагов аутентификации, чтобы проверить идентичность пользователя.

Давайте рассмотрим пример кода из документации Symfony, чтобы лучше понять, как это работает:

### Конфигурация
Первым шагом является настройка аутентификации в файле config/packages/security.yaml вашего проекта.

# config/packages/security.yaml
security:
    providers:
        in_memory:
            memory:
                users:
                    admin:
                        password: 'adminpassword'
                        roles: 'ROLE_ADMIN'
                    user:
                        password: 'userpassword'
                        roles: 'ROLE_USER'
    firewalls:
        main:
            pattern: ^/
            anonymous: true
            http_basic: ~

В этом примере используется in_memory провайдер пользователя, который хранит пользователей и их пароли непосредственно в файле конфигурации. Определены два пользователя: admin и user. У каждого пользователя есть пароль и назначенная ему роль. Отметим, что для аутентификации используется HTTP Basic аутентификация.

### Контроллер
Далее, нам нужно создать контроллер, который будет обрабатывать запрос аутентификации. Создайте контроллер, например, AppControllerSecurityController.php, и определите в нем метод login(), который будет отображать форму аутентификации:

<?php

namespace AppController;

use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentRoutingAnnotationRoute;
use SymfonyComponentSecurityHttpAuthenticationAuthenticationUtils;

class SecurityController extends AbstractController
{
    /**
     * @Route("/login", name="app_login")
     */
    public function login(AuthenticationUtils $authenticationUtils)
    {
        // get the login error if there is one
        $error = $authenticationUtils->getLastAuthenticationError();

        // last username entered by the user
        $lastUsername = $authenticationUtils->getLastUsername();

        return $this->render('security/login.html.twig', [
            'last_username' => $lastUsername,
            'error' => $error
        ]);
    }
}

### Шаблон
Затем, создайте шаблон templates/security/login.html.twig, который будет отображать форму аутентификации:

{% extends 'base.html.twig' %}

{% block body %}
    {% if error %}
        <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
    {% endif %}

    <form action="{{ path('app_login') }}" method="post">
        <label for="username">Username:</label>
        <input type="text" id="username" name="_username" value="{{ last_username }}" required autofocus>
        <br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="_password" required>
        <br>
        <input type="submit" value="Login">
    </form>
{% endblock %}

### Маршрутизация
Наконец, настройте маршрутизацию, добавив следующую строку в config/routes.yaml:

# config/routes.yaml
app_login:
    path: /login
    controller: AppControllerSecurityController::login

Теперь, когда вы перейдете по URL /login, отобразится форма аутентификации. При отправке формы данные будут переданы на маршрут app_login, и компонент Security обработает их. Если пользователь успешно аутентифицирован, он будет перенаправлен на предыдущую страницу или на страницу, указанную в настройках конфигурации.

Это основы аутентификации в Symfony на примере из документации. Вы можете настроить более сложные схемы аутентификации, например, использовать базу данных, LDAP или сторонние сервисы. Symfony предоставляет множество возможностей для аутентификации, и все они могут быть настроены и расширены в соответствии с потребностями вашего проекта.