src/EventListener/UserActiveListener.php line 51

Open in your IDE?
  1. <?php
  2. // === CORRECTION UserActiveListener.php 2025-10-29 ===
  3. namespace App\EventListener;
  4. use App\Entity\User;
  5. use App\Security\AccessChecker;
  6. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpKernel\Event\RequestEvent;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\Security\Core\Security;
  12. use Symfony\Component\HttpFoundation\RequestStack;  // ← UTILISER RequestStack
  13. class UserActiveListener implements EventSubscriberInterface
  14. {
  15.     // Routes où le contrôle est fait (critiques uniquement)
  16.     private const CHECKED_ROUTES = [
  17.         'patient_form',
  18.         'patient_delete',
  19.         'doc_save',
  20.         'doc_delete',
  21.         'consultation_form',
  22.         'user_form',
  23.         'profile'
  24.     ];
  25.     private $session;
  26.     public function __construct(
  27.         private Security $security,
  28.         private AccessChecker $accessChecker,
  29.         private UrlGeneratorInterface $urlGenerator,
  30.         private RequestStack $requestStack  // ← CHANGEMENT : RequestStack au lieu de SessionInterface
  31.     ) {
  32.         // Pas besoin d'initialiser $session ici
  33.     }
  34.     public static function getSubscribedEvents(): array
  35.     {
  36.         return [
  37.             KernelEvents::REQUEST => ['onKernelRequest'10],
  38.         ];
  39.     }
  40.     /**
  41.      * Vérifie à chaque requête CRITIQUE si l'utilisateur est toujours actif
  42.      * OPTIMISÉ : Ne vérifie que sur les routes sensibles
  43.      */
  44.     public function onKernelRequest(RequestEvent $event): void
  45.     {
  46.         if (!$event->isMainRequest()) {
  47.             return;
  48.         }
  49.         $request $event->getRequest();
  50.         $route $request->attributes->get('_route');
  51.         // Routes publiques : skip
  52.         $publicRoutes = ['app_login''app_logout''security_reset_password''app_register'];
  53.         if (in_array($route$publicRoutes)) {
  54.             return;
  55.         }
  56.         // === CHANGEMENT : Vérifier pour TOUS les utilisateurs connectés ===
  57.         $user $this->security->getUser();
  58.         if (!$user instanceof User) {
  59.             return; // Pas connecté = pas de vérification
  60.         }
  61.         // Vérification avec cache
  62.         if (!$this->accessChecker->isUserActive()) {
  63.             $session $this->requestStack->getSession();
  64.             $session->invalidate();
  65.             $session->getFlashBag()->add('error',
  66.                 'Votre compte a été désactivé. Veuillez contacter l\'administrateur.');
  67.             $response = new RedirectResponse(
  68.                 $this->urlGenerator->generate('app_login')
  69.             );
  70.             $event->setResponse($response);
  71.         }
  72.     }
  73. }
  74. // === FIN CORRECTION UserActiveListener ===