<?phpnamespace App\EventSubscriber;use App\Entity\Parameter;use App\Entity\User;use App\Exception\Maintenance\MaintenanceException;use App\Service\Lock\MaintenanceLocker;use App\Service\ParameterProvider;use Symfony\Component\EventDispatcher\EventSubscriberInterface;use Symfony\Component\HttpFoundation\RedirectResponse;use Symfony\Component\HttpKernel\Event\ExceptionEvent;use Symfony\Component\HttpKernel\Event\RequestEvent;use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;use Symfony\Component\Routing\RouterInterface;use Symfony\Component\Security\Core\Security;class RequestSubscriber implements EventSubscriberInterface{ private RouterInterface $router; private Security $security; private MaintenanceLocker $maintenanceLocker; private ParameterProvider $parameterProvider; public function __construct( RouterInterface $router, Security $security, MaintenanceLocker $maintenanceLocker, ParameterProvider $parameterProvider ) { $this->router = $router; $this->security = $security; $this->maintenanceLocker = $maintenanceLocker; $this->parameterProvider = $parameterProvider; } /** * @param RequestEvent $event * @return void */ public function onKernelRequest( RequestEvent $event ): void { /** @var User|null $connectedUser */ $connectedUser = $this->security->getUser(); $member = $connectedUser ? $connectedUser->getMember() : null; // on empeche toute connexion si un membre associé a l'utilisateur connecté est marqué comme supprimé sauf // sauf si un admin est connecté en tant que l'utilisateur connecté if (null !== $member && true === $member->isDeleted() && false === $this->security->isGranted("ROLE_PREVIOUS_ADMIN")) { // redirect vers la page de logout $response = new RedirectResponse($this->router->generate("app_logout")); $event->setResponse($response); return; } if (false === $this->maintenanceLocker->isLocked()) { return; } // On laisse la page de connexion accessible même en mode maintenance pour que l'admin puisse se connecter if ($event->getRequest()->attributes->get("_route") === "mybiz_login") { return; } if (null === $connectedUser) { return; } // Si l'email de l'utilisateur connecté est autorisé à se connecter même en maintenance alors on l'autorise $emailsParameter = $this->parameterProvider->getValue(Parameter::PARAMETER_MAINTENANCE, ParameterProvider::TYPE_ARRAY); if (in_array($connectedUser->getEmail(), $emailsParameter, true)) { return; } // On vérifie également l'impersonnalisation if (true === $this->security->isGranted("ROLE_PREVIOUS_ADMIN")) { return; } throw new MaintenanceException(); } /** * @param ExceptionEvent $event * @return void */ public function onKernelException( ExceptionEvent $event ): void { if ($event->getThrowable() instanceof AccessDeniedHttpException && $this->security->getUser()) { $response = new RedirectResponse($this->router->generate("mybiz_redirect")); $event->setResponse($response); return; }// \Sentry\captureException($event->getThrowable()); } /** * @return string[] */ public static function getSubscribedEvents(): array { return [ 'kernel.request' => 'onKernelRequest', 'kernel.exception' => 'onKernelException', ]; }}