src/TSMS/TsmsBundle/Security/Listener/SessionListener.php line 91

Open in your IDE?
  1. <?php
  2. /**
  3. * Copyright (C) SUEZ Smart Solutions - All Rights Reserved
  4. * On’Connect Gateway Management, 2018
  5. * Unauthorized copying of this file, via any medium is strictly prohibited
  6. * Proprietary and confidential
  7. * For the full copyright and license information, please report to the LICENSE CONTRACT.
  8. */
  9. /**
  10.  * Created by PhpStorm.
  11.  * User: dhaoui.walid<dhaoui.walid@gmail.com>
  12.  * Date: 10/03/2015
  13.  * Time: 15:51.
  14.  */
  15. namespace TSMS\TsmsBundle\Security\Listener;
  16. use Doctrine\ORM\EntityManager;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\HttpFoundation\Response;
  19. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  20. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  21. use Symfony\Component\HttpKernel\HttpKernelInterface;
  22. use Symfony\Component\Routing\RouterInterface;
  23. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  24. use TSMS\AdminBundle\Entity\MaintenanceMessage;
  25. use TSMS\CoreBundle\Entity\User;
  26. class SessionListener
  27. {
  28.     /**
  29.      * @var SessionInterface
  30.      */
  31.     protected $session;
  32.     /**
  33.      * @var RouterInterface
  34.      */
  35.     protected $router;
  36.     /**
  37.      * @var int
  38.      */
  39.     protected $maxIdleTime;
  40.     /**
  41.      * @var bool
  42.      */
  43.     protected $modeMaintenance;
  44.     /**
  45.      * @var TokenStorageInterface
  46.      */
  47.     protected $securityToken;
  48.     /**
  49.      * @var bool
  50.      */
  51.     private $authorizedAccount;
  52.     /**
  53.      * @var bool
  54.      */
  55.     private $entityManager;
  56.     /**
  57.      * @param SessionInterface $session
  58.      * @param RouterInterface $router
  59.      * @param int $maxIdleTime
  60.      * @param bool $modeMaintenance
  61.      */
  62.     public function __construct(
  63.         SessionInterface $session,
  64.         RouterInterface $router,
  65.         TokenStorageInterface $securityToken,
  66.         $maxIdleTime 0,
  67.         $modeMaintenance false,
  68.         $authorizedAccount = [],
  69.         EntityManager $entityManager
  70.     ) {
  71.         $this->session     $session;
  72.         $this->router      $router;
  73.         $this->securityToken      $securityToken;
  74.         $this->maxIdleTime $maxIdleTime;
  75.         $this->modeMaintenance $modeMaintenance;
  76.         $this->authorizedAccount $authorizedAccount;
  77.         $this->entityManager $entityManager;
  78.     }
  79.     public function onKernelRequest(GetResponseEvent $event)
  80.     {
  81.         $maintenanceMessageRepository $this->entityManager->getRepository(MaintenanceMessage::class);
  82.         $maintenanceMessage $maintenanceMessageRepository->findFirst();
  83.         /** si mode maintenance est activĂ© rediriger l'utilisateur vers la page "site en maintenance" */
  84.         $isEnabledMaintenance = ($this->modeMaintenance || $maintenanceMessage instanceof MaintenanceMessage);
  85.         $token $this->securityToken->getToken();
  86.         $user null;
  87.         if ($token) {
  88.             $user $token->getUser();
  89.         }
  90.         if($isEnabledMaintenance
  91.             && ($user InstanceOf User && !in_array($user->getEmail(), $this->authorizedAccount)
  92.             &&  !in_array($event->getRequest()->get('_route') ,['login','site_under_maintenance']))){
  93.             $event->setResponse(new RedirectResponse($this->router->generate('site_under_maintenance')));
  94.           return;
  95.         }
  96.         if(!$isEnabledMaintenance   &&  $event->getRequest()->get('_route') == 'site_under_maintenance'){
  97.             $event->setResponse(new RedirectResponse($this->router->generate('login')));
  98.           return;
  99.         }
  100.         if ($this->maxIdleTime <= 0) {
  101.             return;
  102.         }
  103.         if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
  104.             return;
  105.         }
  106.         if ($this->checkIfShouldContinueSession($event)) {
  107.             return;
  108.         }
  109.         // Beyond this points, session is killed.
  110.         $this->session->invalidate();
  111.         $response $this->getResponse($event);
  112.         $event->setResponse($response);
  113.         return;
  114.     }
  115.     /**
  116.      * Checks if session is fresh enough against max allowed idle time and sends signal to destroy it or not.
  117.      *
  118.      * @param GetResponseEvent $event
  119.      *
  120.      * @return bool should stop and destroy session
  121.      */
  122.     protected function checkIfShouldContinueSession(GetResponseEvent $event)
  123.     {
  124.         $this->session->start();
  125.         if (false !== ($lastUsed $this->defineLastUsed($event))) {
  126.             $this->session->set('last_used'$lastUsed);
  127.         }
  128.         $refreshLastUsed $this->session->get('last_used');
  129.         if ((time() - $refreshLastUsed) <= $this->maxIdleTime) {
  130.             return true;
  131.         }
  132.         return;
  133.     }
  134.     /**
  135.      * Determines whether the session's last used should be refresh or not.
  136.      *
  137.      * @param GetResponseEvent $event
  138.      *
  139.      * @return int|bool whether to refresh or not
  140.      */
  141.     protected function defineLastUsed(GetResponseEvent $event)
  142.     {
  143.         // If route is checking session, there fore it musn't be refresh prior to having its idle time looked at.
  144.         if ('check_session' !== $event->getRequest()->get('_route')) {
  145.             return time();
  146.         }
  147.         // If last used is absent from Session data, refresh it using metadata bag's lastUsed.
  148.         if (!$this->session->get('last_used')) {
  149.             return $this->session->getMetadataBag()->getLastUsed();
  150.         }
  151.         // If reaching this point, then nothing to do.
  152.         return false;
  153.     }
  154.     protected function getResponse(GetResponseEvent $event)
  155.     {
  156.         if ($event->getRequest()->isXmlHttpRequest()) {
  157.             $response = new Response('Session expired');
  158.             $response->setStatusCode(Response::HTTP_FORBIDDEN);
  159.             return $response;
  160.         }
  161.         $redirectParameters = [];
  162.         if (!in_array($event->getRequest()->get('_route'), array('login''logout''check_session''login_check'))) {
  163.             $redirectParameters['_target_path'] = $event->getRequest()->getRequestUri();
  164.         }
  165.         if ('check_session' === $event->getRequest()->getRequestUri()) {
  166.             $redirectParameters['_inactivity'] = true;
  167.         }
  168.         return new RedirectResponse($this->router->generate('logout'$redirectParameters));
  169.     }
  170. }