Как проверять юзера при каждой аутентификации в Symfony 5?

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

Итак, для начала создайте класс UserAuthenticationListener, который будет слушать событие kernel.request. В этом классе вы будете проверять пользователя при каждом запросе:

// src/EventListener/UserAuthenticationListener.php

namespace AppEventListener;

use SymfonyComponentHttpKernelEventRequestEvent;
use SymfonyComponentSecurityCoreExceptionAccessDeniedException;
use SymfonyComponentSecurityCoreSecurity;

class UserAuthenticationListener
{
    private $security;

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

    public function onKernelRequest(RequestEvent $event)
    {
        $user = $this->security->getUser();

        if (!$user) {
            throw new AccessDeniedException('You must be logged in to access this page.');
        }

        // Дополнительная проверка пользователя, например, его ролей или других данных

        // Если проверка не пройдена, можно выбросить исключение, чтобы ограничить доступ пользователя

        // Если проверка пройдена, ничего не делаем
    }
}

Затем зарегистрируйте слушатель событий в вашем файле сервисов:

# config/services.yaml

services:
    AppEventListenerUserAuthenticationListener:
        tags:
            - { name: kernel.event_listener, event: kernel.request }

Теперь, при каждом запросе в вашем приложении, этот слушатель будет вызывать метод onKernelRequest. В этом методе вы можете получить текущего пользователя с помощью сервиса Security и выполнить необходимые проверки. Если проверка не пройдена, вы можете выбросить исключение AccessDeniedException для ограничения доступа пользователя.

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

Также учтите, что код представлен для Symfony 5, если у вас более ранняя версия Symfony, возможно, потребуются некоторые изменения.