src/EventSubscribers/ApiAuthenticationSubscriber.php line 31

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscribers;
  3. use App\Entity\User;
  4. use App\Repository\UserRepository;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Symfony\Component\Security\Core\Authentication\Token\PreAuthenticatedToken;
  10. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  11. use Symfony\Component\Security\Core\User\UserInterface;
  12. class ApiAuthenticationSubscriber implements EventSubscriberInterface
  13. {
  14.     private TokenStorageInterface $tokenStorage;
  15.     private UserRepository $userRepository;
  16.     private int $apiDefaultUserId;
  17.     public function __construct(
  18.         TokenStorageInterface $tokenStorage,
  19.         UserRepository $userRepository,
  20.         int $apiDefaultUserId
  21.     ) {
  22.         $this->tokenStorage $tokenStorage;
  23.         $this->userRepository $userRepository;
  24.         $this->apiDefaultUserId $apiDefaultUserId;
  25.     }
  26.     public function onKernelRequest(RequestEvent $event): void
  27.     {
  28.         if (!$event->isMainRequest()) {
  29.             return;
  30.         }
  31.         $request $event->getRequest();
  32.         $path $request->getPathInfo();
  33.         // Проверяем, что запрос начинается с /api/ или /api-test/
  34.         if (strpos($path'/api/') === || strpos($path'/api-test/') === 0) {
  35.             // Если уже есть аутентифицированный пользователь, ничего не делаем
  36.             if ($this->tokenStorage->getToken() && $this->tokenStorage->getToken()->getUser() instanceof UserInterface) {
  37.                 return;
  38.             }
  39.             $user $this->userRepository->find($this->apiDefaultUserId);
  40.             if (!$user instanceof User) {
  41.                 // Пользователь не найден - можно записать в лог, но не прерываем запрос
  42.                 // Бизнес-логика должна обрабатывать отсутствие пользователя
  43.                 return;
  44.             }
  45.             // Создаём токен с ролью
  46.             $token = new PreAuthenticatedToken(
  47.                 $user,
  48.                 'main',
  49.                 $user->getRoles()
  50.             );
  51.             $token->setAuthenticated(true);
  52.             $this->tokenStorage->setToken($token);
  53.         }
  54.     }
  55.     public static function getSubscribedEvents(): array
  56.     {
  57.         return [
  58.             KernelEvents::REQUEST => ['onKernelRequest'255], // Высокий приоритет
  59.         ];
  60.     }
  61. }