Как правильно в symfony 5.3.6 security использовать CustomAuthentifer и не поломать тестовый loginUser?

Для правильного использования CustomAuthentifer в Symfony 5.3.6 с сохранением функциональности тестового loginUser вам необходимо выполнить следующие шаги:

Шаг 1: Создайте вашу кастомную аутентификацию
Вам нужно создать класс, который будет реализовывать интерфейс AuthenticatorInterface. Этот класс будет отвечать за аутентификацию пользователя.

// src/Security/CustomAuthentifer.php

namespace AppSecurity;

use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentSecurityCoreExceptionAuthenticationException;
use SymfonyComponentSecurityCoreExceptionCustomAuthenticationException;
use SymfonyComponentSecurityCoreSecurity;
use SymfonyComponentSecurityCoreUserUserInterface;
use SymfonyComponentSecurityCoreUserUserProviderInterface;
use SymfonyComponentSecurityGuardAbstractGuardAuthenticator;

class CustomAuthentifer extends AbstractGuardAuthenticator
{
    private $security;

    public function __construct(Security $security)
    {
        $this->security = $security;
    }

    public function supports(Request $request)
    {
        return $request->attributes->get('_route') === 'your_custom_route';
    }

    public function getCredentials(Request $request)
    {
        return [
            'username' => $request->request->get('username'),
            'password' => $request->request->get('password'),
        ];
    }

    public function getUser($credentials, UserProviderInterface $userProvider)
    {
        // Здесь реализуйте логику получения пользователя по данным аутентификации,
        // например, из базы данных или API
        // Возможно, вам потребуется обращение к $this->security для получения текущего пользователя
    }

    public function checkCredentials($credentials, UserInterface $user)
    {
       // Здесь реализуйте логику проверки правильности данных аутентификации.
    }

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
       // Здесь определите логику обработки ошибки аутентификации, например, перенаправление на страницу входа с сообщением об ошибке.
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
    {
         // Здесь определите логику, которая будет применяться после успешной аутентификации пользователя,
         // например, перенаправление на защищенную страницу или установка токена в сессию.
    }
}

Шаг 2: Зарегистрируйте вашу аутентификацию в сервис-контейнере
Вам нужно зарегистрировать ваш класс аутентификации и настроить его в файле config/services.yaml.

# config/services.yaml

services:
    AppSecurityCustomAuthentifer:
        tags: [security.authenticator]

Шаг 3: Настройте вашу систему безопасности
Настройте вашу систему безопасности в файле config/packages/security.yaml, чтобы указать, что вы хотите использовать вашу кастомную аутентификацию.

# config/packages/security.yaml

security:
    providers:
        custom_provider:
            // настройки вашего провайдера пользователя

    firewalls:
        main:
            anonymous: lazy
            guard:
                authenticators:
                    - AppSecurityCustomAuthentifer

            # Другие настройки вашего firewall

    access_control:
        - { path: ^/secured, roles: [ROLE_USER]}
        # Другие разрешения для ограничения доступа

Шаг 4: Обновите ваш контроллер
В контроллере, отвечающем за аутентификацию, вы должны указать your_custom_route, чтобы ваша кастомная аутентификация срабатывала. Например:

// src/Controller/AuthController.php

namespace AppController;

use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentRoutingAnnotationRoute;

class AuthController extends AbstractController
{
    /**
     * @Route("/login", name="login")
     */
    public function login(Request $request)
    {
        // Здесь реализуйте вашу логику аутентификации, вызывая вашу кастомную аутентификацию.
        // Например:
        return $this->redirectToRoute('your_custom_route');
    }
}

Шаг 5: Обновите тестовый loginUser

Ваши тесты, использующие метод loginUser, должны быть обновлены, чтобы включить данные аутентификации, которые вы пытаетесь проверить. Например:

// tests/Contoller/AuthControllerTest.php

namespace AppTestsController;

use SymfonyBundleFrameworkBundleTestWebTestCase;

class AuthControllerTest extends WebTestCase
{
    public function testLogin()
    {
        $client = static::createClient();

        // Здесь реализуйте аутентификацию пользователя для тестирования
        $client->loginUser(/* Добавьте данные пользователя для аутентификации */);

        $client->request('GET', '/secured');
        $this->assertResponseIsSuccessful();
    }
}

Это позволит вам аутентифицировать пользователя во время выполнения теста, используя вашу кастомную аутентификацию.

Надеюсь, эта подробная инструкция поможет вам использовать CustomAuthentifer в Symfony 5.3.6 без поломки тестового loginUser.