src/PaaBundle/Component/Authentication/Handler/SessionIdleHandler.php line 37

Open in your IDE?
  1. <?php
  2. /* 
  3.  * Selon https://stackoverflow.com/questions/18872721/how-to-log-users-off-automatically-after-a-period-of-inactivity
  4.  */
  5. namespace App\PaaBundle\Component\Authentication\Handler;
  6. //use Symfony\Component\BrowserKit\Response;
  7. use Symfony\Component\HttpKernel\HttpKernelInterface;
  8. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  9. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  10. use Symfony\Component\Routing\RouterInterface;
  11. // LG 20230413 déac use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  13. use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
  14. use Symfony\Component\HttpFoundation\JsonResponse// AV 20230414 add
  15. class SessionIdleHandler
  16. {
  17.     protected $session;
  18.     protected $securityToken;
  19.     protected $router;
  20.     protected $maxIdleTime;
  21.     protected $securityContext;     // LG 20230413
  22.     public function __construct(SessionInterface $sessionTokenStorageInterface $securityTokenAuthorizationChecker $securityContextRouterInterface $router$maxIdleTime 0)
  23.     {
  24.         $this->session $session;
  25.         $this->securityToken $securityToken;
  26.         $this->securityContext $securityContext;
  27.         $this->router $router;
  28.         $this->maxIdleTime $maxIdleTime;
  29.     }
  30.     public function onKernelRequest(GetResponseEvent $event)
  31.     {
  32.         
  33.         if (HttpKernelInterface::MASTER_REQUEST != $event->getRequestType()) {
  34.             // La requête en cours n'est pas la requête principale
  35.             return;
  36.         }
  37. // LG 20230905 début
  38.         if ($event->getRequest()->getSession() ==null) {
  39.             // Il n'y a pas de session en cours
  40.             return;
  41.         }
  42.         if ($this->maxIdleTime <= 0) {
  43.             // Il n'y a pas de timeout de session
  44.             return ;
  45.         }
  46. // LG 20230905 fin
  47.         if ($this->securityToken->getToken() === null) {
  48.             // Pas de timeout si pas de token de sécurité
  49.             return ; 
  50.         }
  51.         if (!$this->securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
  52.             // Pas de timeout si l'user est anonyme ou Remembered
  53.             return ; 
  54.         }
  55.         
  56. // LG 20230905 déac        if ($this->maxIdleTime > 0) {
  57.         //Il y a un temps de session maximal défini
  58.         $this->session->start();
  59.         // AV 20230414 début
  60.         // Calcule le temps d'inactivité de la session
  61.         $time time();
  62.         $lapse $time $this->session->get('manualLastUsedTime');
  63.         // Récupère la route de la requête en cours
  64.         $route $event->getRequest()->attributes->get('_route');
  65. // LG 20230905 old            if ('paa_checkSecondsToExpire' == $route) {
  66.         if (in_array($route, ['checkSecondsToExpire''paa_checkSecondsToExpire'])) {
  67.             // Cette route est une simple demande du temps de session restant
  68.             // Renvoyer le temps restant
  69.             // Calcul du nombre de secondes restantes avant l'expiration de la session
  70.             $secToExp $this->maxIdleTime $lapse;
  71.             // Retourne la réponse sous forme de JSON contenant le nombre de secondes restantes
  72.             $event->setResponse(new JsonResponse(['secToExp' => $secToExp]));
  73. // LG 20230905 début
  74.             return ;
  75.         } else if (in_array($route, ['fos_user_security_login''paa_pageTestGetTempsSessionRestant'])) {
  76.             // Cette route ne doit pas faire le RAZ du temps de connexion restant
  77. // LG 20230905 fin 
  78.         } else {
  79.             //Cette route est une route normale de l'application
  80.             //donc on signal que la dernière utilisation de la session est maintenant
  81.             $this->session->set('manualLastUsedTime'$time);
  82.         }
  83.         // AV 20230414 fin
  84. // AV 20230414 déac            $lapse = time() - $this->session->getMetadataBag()->getLastUsed();
  85.         
  86. // LG 20230904 old            if ($lapse > $this->maxIdleTime) {
  87.         if (($token $this->securityToken->getToken()) && $token->getProviderKey()=="main" && $lapse $this->maxIdleTime) {
  88.             // Un token existe déjà, et il est appellé par le mode "main" (par opposition à "api")
  89.             // Et on a dépassé le timeout
  90. //            // Invalider la session (introduit par AV dans testGetTempsSessionRestant)
  91. //            $this->session->invalidate();
  92.             $this->securityToken->setToken(null);
  93.             $this->session->getFlashBag()->set('info''Vous avez été déconnecté suite à l\'inactivité de votre session.');
  94.             $URI $event->getRequest()->getUri() ;
  95.             $this->session->set('URLDemandée'$URI) ;
  96.             // Change the route if you are not using FOSUserBundle.
  97.             // $event->setResponse(new RedirectResponse($this->generateUrl('fos_user_security_login')));
  98. //            // Code introduit par AV dans testGetTempsSessionRestant début
  99. //             // Vérifie si la requête en cours est une requête AJAX
  100. //             if ($event->getRequest()->isXmlHttpRequest()) {
  101. //                 // Si oui, renvoie une réponse HTTP 403 avec un message d'erreur
  102. //                 $event->setResponse(new Response('Logged out due to inactivity.', Response::HTTP_FORBIDDEN));
  103. //             } else {
  104. //                 // Sinon, redirige l'utilisateur vers la page de connexion
  105. //                 $event->setResponse(new RedirectResponse($this->router->generate('login')));
  106. //             }
  107. //            // Code introduit par AV dans testGetTempsSessionRestant fin
  108.         }
  109. // LG 20230905 déac    }
  110.     }
  111. }