<?php
// === CORRECTION UserActiveListener.php 2025-10-29 ===
namespace App\EventListener;
use App\Entity\User;
use App\Security\AccessChecker;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\HttpFoundation\RequestStack; // ← UTILISER RequestStack
class UserActiveListener implements EventSubscriberInterface
{
// Routes où le contrôle est fait (critiques uniquement)
private const CHECKED_ROUTES = [
'patient_form',
'patient_delete',
'doc_save',
'doc_delete',
'consultation_form',
'user_form',
'profile'
];
private $session;
public function __construct(
private Security $security,
private AccessChecker $accessChecker,
private UrlGeneratorInterface $urlGenerator,
private RequestStack $requestStack // ← CHANGEMENT : RequestStack au lieu de SessionInterface
) {
// Pas besoin d'initialiser $session ici
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest', 10],
];
}
/**
* Vérifie à chaque requête CRITIQUE si l'utilisateur est toujours actif
* OPTIMISÉ : Ne vérifie que sur les routes sensibles
*/
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) {
return;
}
$request = $event->getRequest();
$route = $request->attributes->get('_route');
// Routes publiques : skip
$publicRoutes = ['app_login', 'app_logout', 'security_reset_password', 'app_register'];
if (in_array($route, $publicRoutes)) {
return;
}
// === CHANGEMENT : Vérifier pour TOUS les utilisateurs connectés ===
$user = $this->security->getUser();
if (!$user instanceof User) {
return; // Pas connecté = pas de vérification
}
// Vérification avec cache
if (!$this->accessChecker->isUserActive()) {
$session = $this->requestStack->getSession();
$session->invalidate();
$session->getFlashBag()->add('error',
'Votre compte a été désactivé. Veuillez contacter l\'administrateur.');
$response = new RedirectResponse(
$this->urlGenerator->generate('app_login')
);
$event->setResponse($response);
}
}
}
// === FIN CORRECTION UserActiveListener ===