src/EventSubscriber/RequestSubscriber.php line 45

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\Parameter;
  4. use App\Entity\User;
  5. use App\Exception\Maintenance\MaintenanceException;
  6. use App\Service\Lock\MaintenanceLocker;
  7. use App\Service\ParameterProvider;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\RedirectResponse;
  10. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  11. use Symfony\Component\HttpKernel\Event\RequestEvent;
  12. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  13. use Symfony\Component\Routing\RouterInterface;
  14. use Symfony\Component\Security\Core\Security;
  15. class RequestSubscriber implements EventSubscriberInterface
  16. {
  17.     private RouterInterface $router;
  18.     private Security $security;
  19.     private MaintenanceLocker $maintenanceLocker;
  20.     private ParameterProvider $parameterProvider;
  21.     public function __construct(
  22.         RouterInterface   $router,
  23.         Security          $security,
  24.         MaintenanceLocker $maintenanceLocker,
  25.         ParameterProvider $parameterProvider
  26.     )
  27.     {
  28.         $this->router $router;
  29.         $this->security $security;
  30.         $this->maintenanceLocker $maintenanceLocker;
  31.         $this->parameterProvider $parameterProvider;
  32.     }
  33.     /**
  34.      * @param RequestEvent $event
  35.      * @return void
  36.      */
  37.     public function onKernelRequest(
  38.         RequestEvent $event
  39.     ): void
  40.     {
  41.         /** @var User|null $connectedUser */
  42.         $connectedUser $this->security->getUser();
  43.         $member $connectedUser $connectedUser->getMember() : null;
  44.         // on empeche toute connexion si un membre associé a l'utilisateur connecté est marqué comme supprimé sauf
  45.         // sauf si un admin est connecté en tant que l'utilisateur connecté
  46.         if (null !== $member && true === $member->isDeleted() && false === $this->security->isGranted("ROLE_PREVIOUS_ADMIN")) {
  47.             // redirect vers la page de logout
  48.             $response = new RedirectResponse($this->router->generate("app_logout"));
  49.             $event->setResponse($response);
  50.             return;
  51.         }
  52.         if (false === $this->maintenanceLocker->isLocked()) {
  53.             return;
  54.         }
  55.         // On laisse la page de connexion accessible même en mode maintenance pour que l'admin puisse se connecter
  56.         if ($event->getRequest()->attributes->get("_route") === "mybiz_login") {
  57.             return;
  58.         }
  59.         if (null === $connectedUser) {
  60.             return;
  61.         }
  62.         // Si l'email de l'utilisateur connecté est autorisé à se connecter même en maintenance alors on l'autorise
  63.         $emailsParameter $this->parameterProvider->getValue(Parameter::PARAMETER_MAINTENANCEParameterProvider::TYPE_ARRAY);
  64.         if (in_array($connectedUser->getEmail(), $emailsParametertrue)) {
  65.             return;
  66.         }
  67.         // On vérifie également l'impersonnalisation
  68.         if (true === $this->security->isGranted("ROLE_PREVIOUS_ADMIN")) {
  69.             return;
  70.         }
  71.         throw new MaintenanceException();
  72.     }
  73.     /**
  74.      * @param ExceptionEvent $event
  75.      * @return void
  76.      */
  77.     public function onKernelException(
  78.         ExceptionEvent $event
  79.     ): void
  80.     {
  81.         if ($event->getThrowable() instanceof AccessDeniedHttpException && $this->security->getUser()) {
  82.             $response = new RedirectResponse($this->router->generate("mybiz_redirect"));
  83.             $event->setResponse($response);
  84.             return;
  85.         }
  86. //        \Sentry\captureException($event->getThrowable());
  87.     }
  88.     /**
  89.      * @return string[]
  90.      */
  91.     public static function getSubscribedEvents(): array
  92.     {
  93.         return [
  94.             'kernel.request' => 'onKernelRequest',
  95.             'kernel.exception' => 'onKernelException',
  96.         ];
  97.     }
  98. }