src/Aqarmap/Bundle/UserBundle/EventListener/UserLoginListener.php line 48

Open in your IDE?
  1. <?php
  2. namespace Aqarmap\Bundle\UserBundle\EventListener;
  3. use Aqarmap\Bundle\UserBundle\Entity\User;
  4. use Aqarmap\Bundle\UserBundle\Services\UserActivityService;
  5. use FOS\UserBundle\Event\UserEvent;
  6. use FOS\UserBundle\FOSUserEvents;
  7. use FOS\UserBundle\Model\UserManagerInterface;
  8. use Psr\Log\LoggerInterface;
  9. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. use Symfony\Component\HttpFoundation\Cookie;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
  14. use Symfony\Component\Security\Http\SecurityEvents;
  15. class UserLoginListener implements EventSubscriberInterface
  16. {
  17.     private UserManagerInterface $userManager;
  18.     /** @var EventDispatcherInterface */
  19.     private $dispatcher;
  20.     /** @var UserActivityService */
  21.     private $userActivityService;
  22.     private LoggerInterface $logger;
  23.     public function __construct(UserManagerInterface $userManagerEventDispatcherInterface $dispatcherUserActivityService $userActivityServiceLoggerInterface $logger)
  24.     {
  25.         $this->userManager $userManager;
  26.         $this->dispatcher $dispatcher;
  27.         $this->userActivityService $userActivityService;
  28.         $this->logger $logger;
  29.     }
  30.     public static function getSubscribedEvents()
  31.     {
  32.         return [
  33.             SecurityEvents::INTERACTIVE_LOGIN => [['updateLegacyPasswordsListener'], ['setAuthTokenInCookies']],
  34.             FOSUserEvents::SECURITY_IMPLICIT_LOGIN => 'onImplisictLogin',
  35.         ];
  36.     }
  37.     /**
  38.      * Updated the legacy user passwords after logging in, with the new password encoder.
  39.      */
  40.     public function updateLegacyPasswordsListener(InteractiveLoginEvent $event): void
  41.     {
  42.         $request $event->getRequest();
  43.         /** @var User $user */
  44.         $user $event->getAuthenticationToken()->getUser();
  45.         $plainPassword $request->request->get('_password');
  46.         if ($user->getLegacy() && !empty($plainPassword)) {
  47.             $user->setPlainPassword($plainPassword);
  48.             $user->setLegacy(false);
  49.             $this->userManager->updateUser($user);
  50.             $event = new UserEvent($user$event->getRequest());
  51.             $this->dispatcher->dispatch($eventFOSUserEvents::USER_PASSWORD_CHANGED);
  52.         }
  53.         $this->userActivityService->setSyncInCookies(true);
  54.     }
  55.     /**
  56.      * Set the user token in cookies after login for the use on the frontend (BFF).
  57.      */
  58.     public function setAuthTokenInCookies(InteractiveLoginEvent $event): void
  59.     {
  60.         $this->logger->debug('Setting auth token in cookies');
  61.         /** @var User $user */
  62.         $user $event->getAuthenticationToken()->getUser();
  63.         $response = new Response();
  64.         $accessTokenCookie Cookie::create('access_token'$user->getUserAccessToken())
  65.             ->withHttpOnly(false)
  66.             ->withExpires(new \DateTime('+30 day'))
  67.         ;
  68.         $refreshTokenCookie Cookie::create('refresh_token'$user->getUserRefreshToken())
  69.             ->withHttpOnly(false)
  70.             ->withExpires(new \DateTime('+30 day'))
  71.         ;
  72.         $response->headers->setCookie($accessTokenCookie);
  73.         $response->headers->setCookie($refreshTokenCookie);
  74.         $response->sendHeaders();
  75.     }
  76.     /**
  77.      * Listen when user login programmatically.
  78.      */
  79.     public function onImplisictLogin(UserEvent $userEvent): void
  80.     {
  81.         $this->userActivityService->setSyncInCookies(true);
  82.     }
  83. }