src/EventListener/SessionIdleListener.php line 85

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use Psr\Log\LoggerInterface;
  4. use Symfony\Component\HttpFoundation\Session\Session;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use Symfony\Component\Routing\RouterInterface;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
  9. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  10. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  11. use Symfony\Contracts\Translation\TranslatorInterface;
  12. //use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
  13. class SessionIdleListener
  14. {
  15.     /**
  16.      * @var int
  17.      */
  18.     private $maxIdleTime;
  19.     /**
  20.      * @var int
  21.      */
  22.     private $maxBackendIdleTime;
  23.     /**
  24.      * @var Session
  25.      */
  26.     private $session;
  27.     /**
  28.      * @var TokenStorageInterface
  29.      */
  30.     private $tokenStorage;
  31.     /**
  32.      * @var RouterInterface
  33.      */
  34.     private $router;
  35.     /**
  36.      * @var AuthorizationCheckerInterface
  37.      */
  38.     private $checker;
  39.     /**
  40.      * @var LoggerInterface
  41.      */
  42.     private $logger;
  43.     /**
  44.      * @var TranslatorInterface
  45.      */
  46.     private $translator;
  47.     /**
  48.      * SessionIdleHandler constructor.
  49.      * @param Session $session
  50.      * @param TokenStorageInterface $tokenStorage
  51.      * @param RouterInterface $router
  52.      * @param AuthorizationCheckerInterface $checker
  53.      * @param LoggerInterface $logger
  54.      * @param TranslatorInterface $translator
  55.      * @param int $maxIdleTime
  56.      * @param int $maxBackendIdleTime
  57.      */
  58.     public function __construct(Session $sessionTokenStorageInterface $tokenStorageRouterInterface $routerAuthorizationCheckerInterface $checkerLoggerInterface $loggerTranslatorInterface $translatorint $maxIdleTime 300int $maxBackendIdleTime 1800)
  59.     {
  60.         $this->maxIdleTime $maxIdleTime;
  61.         $this->maxBackendIdleTime $maxBackendIdleTime;
  62.         $this->session $session;
  63.         $this->router $router;
  64.         $this->checker $checker;
  65.         $this->tokenStorage $tokenStorage;
  66.         $this->logger $logger;
  67.         $this->translator $translator;
  68.     }
  69.     /**
  70.      * @param RequestEvent $event
  71.      */
  72.     public function onKernelRequest(RequestEvent $event): void
  73.     {
  74. //        $this->logger->error("max_idle_time: ".$this->maxIdleTime);
  75. //        $this->logger->error("master: ".$event->isMasterRequest());
  76. //        $this->logger->error("anonymous: ".$this->isAuthenticatedAnonymously());
  77.         if (!$event->isMainRequest()
  78.             || $this->maxIdleTime <= 0
  79.             || $this->isAuthenticatedAnonymously()) {
  80. //            $this->logger->error("return");
  81.             return;
  82.         }
  83.         $admin 0;
  84.         if ($this->checker->isGranted("ROLE_BACKEND_USER")) {
  85.             $admin 1;
  86.         }
  87. //        $this->logger->error("admin: ". $admin);
  88. //        $session = $this->session;
  89. //        $session->start();
  90. //        $this->logger->error("now: ".time() );
  91. //        $this->logger->error("last used: ".$this->session->getMetadataBag()->getLastUsed());
  92. //        $this->logger->error("diff  : ".((time() - $this->session->getMetadataBag()->getLastUsed())));
  93. //        $this->logger->error("greater: ".((time() - $this->session->getMetadataBag()->getLastUsed()) <= $this->maxIdleTime));
  94. //        $this->logger->error("greater: ".((time() - $this->session->getMetadataBag()->getLastUsed()) <= $this->maxBackendIdleTime));
  95.         if ($admin === && ((time() - $this->session->getMetadataBag()->getLastUsed()) <= $this->maxIdleTime)) {
  96.             return;
  97.         }
  98.         if ($admin === && ((time() - $this->session->getMetadataBag()->getLastUsed()) <= $this->maxBackendIdleTime)) {
  99.             return;
  100.         }
  101.         $this->tokenStorage->setToken();
  102.         $this->session->getFlashBag()->set('error'$this->translator->trans('idle_logout.exited'));
  103.         if ($admin === 1) {
  104.             $event->setResponse(new RedirectResponse($this->router->generate('backend_login')));
  105.         } else {
  106.             $event->setResponse(new RedirectResponse($this->router->generate('app_login')));
  107.         }
  108.     }
  109.     /**
  110.      * @return bool
  111.      */
  112.     private function isAuthenticatedAnonymously(): bool
  113.     {
  114. //        $this->logger->error(serialize($this->tokenStorage->getToken()));
  115. //        $this->logger->error(is_a($this->tokenStorage->getToken(), AnonymousToken::class));
  116.         return !$this->tokenStorage->getToken()
  117.             ||
  118.             is_a($this->tokenStorage->getToken(), AnonymousToken::class)
  119.             //!$this->checker->isGranted(AuthenticatedVoter::IS_AUTHENTICATED_FULLY)
  120.             ;
  121.     }
  122. }