src/Component/EventSubscriber/AuthenticationSubscriber.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Component\EventSubscriber;
  3. use App\Entity\Profil;
  4. use App\Entity\User;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Symfony\Component\Routing\RouterInterface;
  10. use Symfony\Component\Security\Core\Event\AuthenticationSuccessEvent;
  11. use Symfony\Component\Security\Csrf\TokenStorage\TokenStorageInterface;
  12. use function Symfony\Component\String\s;
  13. class AuthenticationSubscriber implements EventSubscriberInterface
  14. {
  15. private TokenStorageInterface $tokenStorage;
  16. private RouterInterface $router;
  17. private RequestStack $requestStack;
  18. public function __construct(TokenStorageInterface $tokenStorage, RouterInterface $router, RequestStack $requestStack)
  19. {
  20. $this->tokenStorage = $tokenStorage;
  21. $this->router = $router;
  22. $this->requestStack = $requestStack;
  23. }
  24. public static function getSubscribedEvents(): array
  25. {
  26. return [
  27. AuthenticationSuccessEvent::class => 'onAuthenticationSuccess',
  28. ];
  29. }
  30. public function onAuthenticationSuccess(AuthenticationSuccessEvent $event)
  31. {
  32. /** @var User $user */
  33. $user = $event->getAuthenticationToken()->getUser();
  34. if (!$user->getProfil() instanceof Profil) {
  35. $request = $this->requestStack->getCurrentRequest();
  36. $token = $event->getAuthenticationToken();
  37. $this->tokenStorage->removeToken($token);
  38. $request->getSession()->getFlashBag()->add('danger','Accès refusé');
  39. $userAgent = $request->headers->get('User-Agent');
  40. // réponse en mode JSON si l'user agent contient "postman" ou bien "okhttp"
  41. if (!s(strtolower($userAgent))->containsAny(['postman', 'okhttp'])) {
  42. $response = new RedirectResponse($this->router->generate('app_login'));
  43. } else {
  44. $response = new JsonResponse(['message' => 'Accès refusé']);
  45. }
  46. $response->send();
  47. exit;
  48. }
  49. }
  50. }