src/Security/SessionIdleHandler.php line 43

  1. <?php
  2. namespace App\Security;
  3. use Symfony\Component\HttpKernel\HttpKernelInterface;
  4. use Symfony\Component\HttpKernel\Event\RequestEvent;
  5. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  6. use Symfony\Component\Routing\RouterInterface;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  9. use Symfony\Component\HttpFoundation\RequestStack;
  10. class SessionIdleHandler
  11. {
  12.     protected $session;
  13.     protected TokenStorageInterface $securityToken;
  14.     protected RouterInterface $router;
  15.     protected $maxIdleTime;
  16.     protected RequestStack $requestStack;
  17.     public function __construct($maxIdleTime, RequestStack $requestStack, TokenStorageInterface $securityToken, RouterInterface $router)
  18.     {
  19.         $this->requestStack = $requestStack;
  20.         $this->securityToken = $securityToken;
  21.         $this->router = $router;
  22.         $this->maxIdleTime = $maxIdleTime;
  23.     }
  24.     public function onKernelRequest(RequestEvent  $event): void
  25.     {
  26.         $this->session = $this->requestStack->getSession();
  27.         if (HttpKernelInterface::MASTER_REQUEST != $event->getRequestType()) {
  28.             return;
  29.         }
  30.         if ($this->maxIdleTime > 0) {
  31.             $this->session->start();
  32.             $lapse = time() - $this->session->getMetadataBag()->getLastUsed();
  33.             if ($lapse > $this->maxIdleTime) {
  34.                 $this->securityToken->setToken(null);
  35.                 $this->session->getFlashBag()->set('info', 'You have been logged out due to inactivity.');
  36.                 // logout is defined in security.yaml.  See 'Logging Out' section here:
  37.                 // https://symfony.com/doc/4.1/security.html
  38.                 $event->setResponse(new RedirectResponse($this->router->generate('app_logout')));
  39.             }
  40.         }
  41.     }
  42. }