Как авторизовать symfony по уже имеющейся сессии?

Для авторизации Symfony по уже существующей сессии, вам необходимо выполнить следующие шаги:

1. Настройте конфигурацию сессии в вашем файле config/packages/framework.yaml. Убедитесь, что параметры handler_id и cookie_secure настроены правильно для вашего окружения.

Пример:

   framework:
     session:
       handler_id: session.handler.native_file
       cookie_secure: auto

2. Создайте класс, который будет отвечать за проверку правильности авторизации пользователя. Обычно это делается путем реализации интерфейса SymfonyComponentSecurityCoreUserUserCheckerInterface и переопределения метода checkPreAuth(). В этом методе вы можете проверить, что пользователь в вашей сессии имеет активную аутентификацию.

Пример:

   <?php
   
   namespace AppSecurity;
   
   use SymfonyComponentSecurityCoreUserUserCheckerInterface;
   use SymfonyComponentSecurityCoreUserUserInterface;
   use SymfonyComponentSecurityCoreExceptionAccountStatusException;
   use SymfonyComponentSecurityCoreExceptionCustomUserMessageAccountStatusException;
   
   class SessionUserChecker implements UserCheckerInterface
   {
       public function checkPreAuth(UserInterface $user)
       {
           // Проверяем, что пользователь в вашей сессии имеет активную аутентификацию
           if (!$user->isAuthenticated()) {
               throw new CustomUserMessageAccountStatusException('Аутентификация не удалась');
           }
       }
   
       public function checkPostAuth(UserInterface $user)
       {
           // Ничего не делаем
       }
   }

3. Зарегистрируйте ваш класс для проверки пользователя в файле config/packages/security.yaml. Добавьте следующую конфигурацию в секцию security:

Пример:

   security:
     providers:
       in_session:
         id: AppSecuritySessionUserProvider
   
     firewalls:
       main:
         anonymous: ~
         provider: in_session
         # ...
   
     access_control:
       - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
       # ...

4. Создайте провайдер пользователя, который будет получать пользователя из вашей сессии. Вам нужно реализовать интерфейс SymfonyComponentSecurityCoreUserUserProviderInterface и переопределить метод loadUserByUsername(). В этом методе вы можете проверить, что пользователь в вашей сессии имеет активную аутентификацию, и вернуть объект пользователя.

Пример:

   <?php
   
   namespace AppSecurity;
   
   use SymfonyComponentSecurityCoreUserUserInterface;
   use SymfonyComponentSecurityCoreUserUserProviderInterface;
   
   class SessionUserProvider implements UserProviderInterface
   {
       public function loadUserByUsername($username)
       {
           // Возвращает пользователей, у которых активная аутентификация, из вашей сессии
           return $this->session->get('authenticated_users', []);
       }
   
       public function refreshUser(UserInterface $user)
       {
           return $user;
       }
   
       public function supportsClass($class)
       {
           return true;
       }
   }

5. Обновите файл config/packages/security.yaml, чтобы использовать провайдер пользователя, который вы только что создали:

Пример:

   security:
     providers:
       in_session:
         id: AppSecuritySessionUserProvider

Теперь, если у вас есть активная сессия пользователя, Symfony будет использовать эту сессию для авторизации пользователя в вашем приложении.