src/Handler/SessionIdleHandler.php line 56

  1. use Symfony\Component\HttpFoundation\RedirectResponse;
  2. use Symfony\Component\HttpKernel\Event\RequestEvent;
  3. use Symfony\Component\HttpKernel\HttpKernelInterface;
  4. use Symfony\Component\Routing\RouterInterface;
  5. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  6. use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
  7. final class SessionIdleHandler
  8. {
  9.     public function __construct(
  10.         private TokenStorageInterface $tokenStorage,
  11.         private RouterInterface $router,
  12.         private AuthorizationChecker $authorizationChecker,
  13.         private int $maxIdleTime 0
  14.     ) {
  15.     }
  16.     public function onKernelRequest(RequestEvent $event): void
  17.     {
  18.         if (HttpKernelInterface::MAIN_REQUEST != $event->getRequestType()) {
  19.             return;
  20.         }
  21.         if ($this->maxIdleTime 0) {
  22.             $session $event->getRequest()->getSession();
  23.             $session->start();
  24.             $lapse time() - $session->getMetadataBag()->getLastUsed();
  25.             if ($lapse $this->maxIdleTime && $this->authorizationChecker->isGranted('ROLE_USER')) {
  26.                 $this->tokenStorage->setToken();
  27.                 $event->setResponse(
  28.                     new RedirectResponse(
  29.                         $this->router->generate(
  30.                             'security_login',
  31.                             ['session_idle' => true]
  32.                         )
  33.                     )
  34.                 );
  35.             }
  36.         }
  37.     }
  38. }