src/Bundles/UserBundle/EventListener/SessionIdleHandler.php line 28

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Bundles\UserBundle\EventListener;
  4. use App\Bundles\UserBundle\Service\User\UserLogoutService;
  5. use App\Platform\Service\SessionProvider;
  6. use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  9. use Symfony\Component\HttpKernel\Event\RequestEvent;
  10. use Symfony\Component\HttpKernel\HttpKernelInterface;
  11. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  12. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  13. #[AsEventListener(eventRequestEvent::class, method'onKernelRequest')]
  14. class SessionIdleHandler
  15. {
  16.     public function __construct(
  17.         private readonly UserLogoutService $userLogoutService,
  18.         private readonly SessionProvider $sessionProvider,
  19.         private readonly TokenStorageInterface $tokenStorage,
  20.         private readonly int $sessionIdleTime,
  21.     ) {
  22.     }
  23.     public function onKernelRequest(RequestEvent $event): void
  24.     {
  25.         if ($event->getRequestType() !== HttpKernelInterface::MAIN_REQUEST) {
  26.             return;
  27.         }
  28.         if (!$token $this->tokenStorage->getToken()) {
  29.             return;
  30.         }
  31.         if ($this->sessionIdleTime <= 0) {
  32.             return;
  33.         }
  34.         $session $this->sessionProvider->provide();
  35.         $session->start();
  36.         $lapse time() - $session->getMetadataBag()->getLastUsed();
  37.         if ($lapse $this->sessionIdleTime) {
  38.             $this->logoutAndRedirectUser($event$token$session);
  39.         }
  40.     }
  41.     private function logoutAndRedirectUser(RequestEvent $eventTokenInterface $tokenSessionInterface $session): void
  42.     {
  43.         $this->userLogoutService->logout($event->getRequest(), $token$session);
  44.         $event->setResponse(new RedirectResponse('/login'));
  45.     }
  46. }