<?php
namespace App\EventListener;
use App\Utils\KeycloakAdmin;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
class RequestListener
{
private RequestEvent $event;
public function __construct(private readonly RequestStack $requestStack,
private readonly UrlGeneratorInterface $urlGenerator,
private readonly Security $security,
private readonly TranslatorInterface $translator)
{
}
public function onKernelRequest(RequestEvent $event): void
{
$languagesAvailable = ['fr', 'en'];
$request = $event->getRequest();
// First choice of visitor language
$preferredLang = $request->getPreferredLanguage();
if (in_array($preferredLang, $languagesAvailable)) {
// For Symfony
$request->setLocale($preferredLang);
// For Twig
$this->translator->setLocale($preferredLang);
}
if ($event->isMainRequest()) {
$this->event = $event;
// /!\ Voteur désactivé (problème de flow keycloak)
//$this->checkUserSession();
}
}
private function checkUserSession(): void
{
$session = $this->requestStack->getSession();
$check = false;
$lastCheck = $session->get('lastUserSessionCheck');
if (!$lastCheck) {
$lastCheck = new \DateTime();
$session->set("lastUserSessionCheck", $lastCheck);
$check = true;
}
$now = new \DateTime();
$diff = intval($lastCheck->diff($now)->format("%I"));
if ($diff >= intval($_SERVER['USER_SESSION_CHECK_INTERVAL']) )
$check = true;
if ($check) {
$credentials = $session->get('tokenSecurity');
if ($credentials) {
$keycloak = new KeycloakAdmin(false);
if (!$keycloak->isSessionActive()) {
// Evite une redirection en boucle
if ($this->event->getRequest()->attributes->get('_route') != 'app_logout')
$this->event->setResponse(new RedirectResponse($this->urlGenerator->generate('app_logout')));
}
}
$session->set("lastUserSessionCheck", new \DateTime());
}
}
}