<?php
namespace App\EventListener;
use App\Entity\Niveau;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class KernelRequestListener
{
protected $token;
protected $router;
protected $em;
protected $session;
protected $logger;
private ParameterBagInterface $parameterBag;
public function __construct(
RouterInterface $router,
TokenStorageInterface $token_storage,
EntityManagerInterface $em,
SessionInterface $session,
LoggerInterface $samlLogger,
ParameterBagInterface $parameterBag
)
{
$this->token = $token_storage;
$this->router = $router;
$this->em = $em;
$this->session = $session;
$this->logger = $samlLogger;
$this->parameterBag = $parameterBag;
}
public function onKernelRequest(RequestEvent $event)
{
$request = $event->getRequest();
if ($event->isMainRequest()) {
$host = $request->getHost();
$patternroute = "/(saml_)(.*)/";
/* Si le user est loggué */
if ($this->token->getToken() && $this->token->getToken()->getUser() != 'anon.') {
/* Si l'url est celle de l'APP mais qu'on est loggué et qu'on demande une route saml */
/* On redirige vers la home */
if ($host == $this->parameterBag->get('SAML_APP_HOST') && preg_match($patternroute, $request->attributes->get('_route'))) {
$this->logger->info('SAML OK');
$event->setResponse(new RedirectResponse('https://' . $this->parameterBag->get('SAML_APP_HOST')));
}
/* On force le chargement de la page change_password tant que le compte est en mode mdp temporaire */
if ($this->token->getToken()->getUser()->getIsTemporaryPassword() && $request->attributes->get('_route') != 'change_password') {
$event->setResponse(new RedirectResponse($this->router->generate('change_password')));
}
} else {
/* S'il n'est pas loggué */
/* que l'url est celle de AUTH */
if ($host == $this->parameterBag->get('SAML_AUTH_HOST')) {
if (!preg_match($patternroute, $request->attributes->get('_route'))) {
/* mais que la route demandée n'est pas lié à saml on redirige vers l'URL de l'appli */
$event->setResponse(new RedirectResponse('https' . '://' . $this->parameterBag->get('SAML_APP_HOST')));
}
}
}
}
return;
}
}