src/Security/AppAccessDeniedHandler.php line 55

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use App\Component\ActivityLogger\ActivityLoggerStrategy;
  4. use Symfony\Component\HttpFoundation\JsonResponse;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpFoundation\Session\Session;
  10. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  11. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  12. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  13. use Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface;
  14. use Symfony\Contracts\Translation\TranslatorInterface;
  15. class AppAccessDeniedHandler implements AccessDeniedHandlerInterface
  16. {
  17. /**
  18. * @var UrlGeneratorInterface
  19. */
  20. private UrlGeneratorInterface $urlGenerator;
  21. /**
  22. * @var SessionInterface
  23. */
  24. private SessionInterface $session;
  25. /**
  26. * @var TranslatorInterface
  27. */
  28. private TranslatorInterface $translator;
  29. /**
  30. * @var ActivityLoggerStrategy
  31. */
  32. private ActivityLoggerStrategy $logger;
  33. /**
  34. * AccessDeniedHandler constructor.
  35. * @param UrlGeneratorInterface $urlGenerator
  36. * @param SessionInterface $session
  37. * @param TranslatorInterface $translator
  38. * @param ActivityLoggerStrategy $logger
  39. */
  40. public function __construct(
  41. UrlGeneratorInterface $urlGenerator,
  42. TranslatorInterface $translator,
  43. ActivityLoggerStrategy $logger,
  44. RequestStack $requestStack
  45. ) {
  46. $this->urlGenerator = $urlGenerator;
  47. $this->translator = $translator;
  48. $this->logger = $logger;
  49. $this->session = $requestStack->getCurrentRequest()->getSession();
  50. }
  51. /**
  52. * @param Request $request
  53. * @param AccessDeniedException $accessDeniedException
  54. * @return Response
  55. */
  56. public function handle(Request $request, AccessDeniedException $accessDeniedException): Response
  57. {
  58. // If incoming request expects JsonResponse, return it
  59. $acceptHeader = $request->headers->get('Accept');
  60. $message = ($accessDeniedException->getMessage() === 'Access Denied.') ? $this->translator->trans('errors.access_denied', [], 'security') : $accessDeniedException->getMessage();
  61. $this->logger->log('access.denied', $request, $message);
  62. if ($acceptHeader === 'json' || $acceptHeader === 'application/json') {
  63. return new JsonResponse(
  64. [
  65. 'status' => 'error',
  66. 'message' => $message,
  67. ],
  68. Response::HTTP_FORBIDDEN
  69. );
  70. }
  71. /** @var Session $session */
  72. $session = $this->session;
  73. // Add flash message about missing permissions
  74. $session->getFlashBag()->add(
  75. 'access-error',
  76. $message
  77. );
  78. // If the request comes from administration, redirect at dashboard
  79. if (strpos('app_', $request->attributes->get('_route')) === 0) {
  80. return new RedirectResponse($this->urlGenerator->generate('index'));
  81. }
  82. return new RedirectResponse($this->urlGenerator->generate('login'));
  83. }
  84. }