diff --git a/src/EventListener/AccessDeniedListener.php b/src/EventListener/AccessDeniedListener.php new file mode 100644 index 0000000..f4059a6 --- /dev/null +++ b/src/EventListener/AccessDeniedListener.php @@ -0,0 +1,55 @@ +getThrowable(); + + if (false === $exception instanceof AccessDeniedException) { + return; + } + + $request = $event->getRequest(); + $route = $request->attributes->get('_route'); + + // Treat OAuth2 routes differently + if (in_array($route, ['oauth2_authorize', 'oauth2_token'])) { + $request->getSession()->getFlashBag()->add('info', 'Bitte melde dich an.'); + + $this->logger->info('OAuth2 authorization request', [ + 'uri' => $request->getRequestUri(), + ]); + + return; + } + + if (null === $this->security->getUser()) { + $request->getSession()->getFlashBag()->add('info', 'Bitte melde dich an.'); + } else { + $request->getSession()->getFlashBag()->add('error', 'Zugriff verweigert'); + // Unset potentially set target path to avoid access denied errors + $request->getSession()->remove('_security.main.target_path'); + } + + $this->logger->warning('Access denied', [ + 'uri' => $request->getRequestUri(), + ]); + } +}