src/EventListener/RequestListener.php line 25

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Utils\KeycloakAdmin;
  4. use Symfony\Component\HttpFoundation\RedirectResponse;
  5. use Symfony\Component\HttpFoundation\RequestStack;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  8. use Symfony\Component\Security\Core\Security;
  9. use Symfony\Contracts\Translation\TranslatorInterface;
  10. class RequestListener
  11. {
  12.     private RequestEvent $event;
  13.     public function __construct(private readonly RequestStack          $requestStack,
  14.                                 private readonly UrlGeneratorInterface $urlGenerator,
  15.                                 private readonly Security              $security,
  16.                                 private readonly TranslatorInterface   $translator)
  17.     {
  18.     }
  19.     public function onKernelRequest(RequestEvent $event): void
  20.     {
  21.         $languagesAvailable = ['fr''en'];
  22.         $request $event->getRequest();
  23.         // First choice of visitor language
  24.         $preferredLang $request->getPreferredLanguage();
  25.         if (in_array($preferredLang$languagesAvailable)) {
  26.             // For Symfony
  27.             $request->setLocale($preferredLang);
  28.             // For Twig
  29.             $this->translator->setLocale($preferredLang);
  30.         }
  31.         if ($event->isMainRequest()) {
  32.             $this->event $event;
  33.             // /!\ Voteur désactivé (problème de flow keycloak)
  34.             //$this->checkUserSession();
  35.         }
  36.     }
  37.     private function checkUserSession(): void
  38.     {
  39.         $session $this->requestStack->getSession();
  40.         $check false;
  41.         $lastCheck $session->get('lastUserSessionCheck');
  42.         if (!$lastCheck) {
  43.             $lastCheck = new \DateTime();
  44.             $session->set("lastUserSessionCheck"$lastCheck);
  45.             $check true;
  46.         }
  47.         $now = new \DateTime();
  48.         $diff intval($lastCheck->diff($now)->format("%I"));
  49.         if ($diff >= intval($_SERVER['USER_SESSION_CHECK_INTERVAL']) )
  50.             $check true;
  51.         if ($check) {
  52.             $credentials $session->get('tokenSecurity');
  53.             if ($credentials) {
  54.                 $keycloak = new KeycloakAdmin(false);
  55.                 if (!$keycloak->isSessionActive()) {
  56.                     // Evite une redirection en boucle
  57.                     if ($this->event->getRequest()->attributes->get('_route') != 'app_logout')
  58.                         $this->event->setResponse(new RedirectResponse($this->urlGenerator->generate('app_logout')));
  59.                 }
  60.             }
  61.             $session->set("lastUserSessionCheck", new \DateTime());
  62.         }
  63.     }
  64. }