src/EventSubscriber/MyBizJwtUserSubscriber.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Service\Member\Jwt\UserJwtManager;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  8. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  9. class MyBizJwtUserSubscriber implements EventSubscriberInterface
  10. {
  11.     public const MYBIZ_JWT_TOKEN "mybiz-jwt-token";
  12.     private TokenStorageInterface $tokenStorage;
  13.     private UserJwtManager $userJwtManager;
  14.     public function __construct(
  15.         TokenStorageInterface $tokenStorage,
  16.         UserJwtManager        $userJwtManager
  17.     )
  18.     {
  19.         $this->tokenStorage $tokenStorage;
  20.         $this->userJwtManager $userJwtManager;
  21.     }
  22.     /**
  23.      * @param RequestEvent $event
  24.      * @return void
  25.      */
  26.     public function onKernelRequest(
  27.         RequestEvent $event
  28.     ): void
  29.     {
  30.         $request $event->getRequest();
  31.         // on récupère les paramètres de la request
  32.         $mybizJwtToken $event->getRequest()->get(self::MYBIZ_JWT_TOKEN);
  33.         // si aucun token n'est envoyé en paramètre
  34.         if (null === $mybizJwtToken) {
  35.             return;
  36.         }
  37.         // Si l'utilisateur est deja connecté on le déceonnecte
  38.         if (null !== $this->tokenStorage->getToken()) {
  39.             $this->tokenStorage->setToken(null);
  40.         }
  41.         // On récupère l'utilisateur pointé par le JWT
  42.         $user $this->userJwtManager->getUserByJwtToken($mybizJwtToken);
  43.         // S'il n'existe pas on ne fait rien
  44.         if (null === $user) {
  45.             return;
  46.         }
  47.         // Sinon on connecte l'utilisateur et on l'envoie sur la page demandée
  48.         $token = new UsernamePasswordToken($user$user->getPassword(), ["futures_website"], $user->getRoles());
  49.         $this->tokenStorage->setToken($token);
  50.         // 🚀 On redirige vers l’URL d’origine demandée par l’utilisateur
  51.         $cleanUrl $request->getUriForPath($request->getPathInfo()); // même URL mais sans le paramètre token
  52.         $event->setResponse(new RedirectResponse($cleanUrl));
  53.     }
  54.     /**
  55.      * @return string[]
  56.      */
  57.     public static function getSubscribedEvents(): array
  58.     {
  59.         return [
  60.             'kernel.request' => ['onKernelRequest', -10],
  61.         ];
  62.     }
  63. }