diff --git a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php index f33b0a303dd877cb51c93e4c859219dae9e80002..d1daeb11a541ed6c6bfbea83e0cb04ce5cd61063 100644 --- a/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php +++ b/core/modules/user/src/EventSubscriber/AccessDeniedSubscriber.php @@ -2,14 +2,12 @@ namespace Drupal\user\EventSubscriber; +use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase; use Drupal\Core\Session\AccountInterface; use Drupal\Core\Routing\RouteMatch; use Drupal\Core\Url; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpKernel\Event\ExceptionEvent; -use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; -use Symfony\Component\HttpKernel\KernelEvents; /** * Redirects users when access is denied. @@ -19,7 +17,7 @@ * their profile page and from the user registration form to their profile edit * form. */ -class AccessDeniedSubscriber implements EventSubscriberInterface { +class AccessDeniedSubscriber extends HttpExceptionSubscriberBase { /** * The current user. @@ -38,52 +36,55 @@ public function __construct(AccountInterface $account) { $this->account = $account; } + /** + * {@inheritdoc} + */ + protected function getHandledFormats(): array { + return ['html']; + } + + /** + * {@inheritdoc} + */ + protected static function getPriority(): int { + // Use a higher priority than ExceptionLoggingSubscriber, because there's + // no need to log the exception if we can redirect. + // @see Drupal\Core\EventSubscriber\ExceptionLoggingSubscriber + return 75; + } + /** * Redirects users when access is denied. * * @param \Symfony\Component\HttpKernel\Event\ExceptionEvent $event * The event to process. */ - public function onException(ExceptionEvent $event) { - $exception = $event->getThrowable(); - if ($exception instanceof AccessDeniedHttpException) { - $route_name = RouteMatch::createFromRequest($event->getRequest())->getRouteName(); - $redirect_url = NULL; - if ($this->account->isAuthenticated()) { - switch ($route_name) { - case 'user.login'; - // Redirect an authenticated user to the profile page. - $redirect_url = Url::fromRoute('entity.user.canonical', ['user' => $this->account->id()], ['absolute' => TRUE]); - break; + public function on403(ExceptionEvent $event): void { + $route_name = RouteMatch::createFromRequest($event->getRequest())->getRouteName(); + $redirect_url = NULL; + if ($this->account->isAuthenticated()) { + switch ($route_name) { + case 'user.login'; + // Redirect an authenticated user to the profile page. + $redirect_url = Url::fromRoute('entity.user.canonical', ['user' => $this->account->id()], ['absolute' => TRUE]); + break; - case 'user.register'; - // Redirect an authenticated user to the profile form. - $redirect_url = Url::fromRoute('entity.user.edit_form', ['user' => $this->account->id()], ['absolute' => TRUE]); - break; - } - } - elseif ($route_name === 'user.page') { - $redirect_url = Url::fromRoute('user.login', [], ['absolute' => TRUE]); - } - elseif (in_array($route_name, ['user.logout', 'user.logout.confirm'], TRUE)) { - $redirect_url = Url::fromRoute('<front>', [], ['absolute' => TRUE]); - } - - if ($redirect_url) { - $event->setResponse(new RedirectResponse($redirect_url->toString())); + case 'user.register'; + // Redirect an authenticated user to the profile form. + $redirect_url = Url::fromRoute('entity.user.edit_form', ['user' => $this->account->id()], ['absolute' => TRUE]); + break; } } - } + elseif ($route_name === 'user.page') { + $redirect_url = Url::fromRoute('user.login', [], ['absolute' => TRUE]); + } + elseif (in_array($route_name, ['user.logout', 'user.logout.confirm'], TRUE)) { + $redirect_url = Url::fromRoute('<front>', [], ['absolute' => TRUE]); + } - /** - * {@inheritdoc} - */ - public static function getSubscribedEvents(): array { - // Use a higher priority than - // \Drupal\Core\EventSubscriber\ExceptionLoggingSubscriber, because there's - // no need to log the exception if we can redirect. - $events[KernelEvents::EXCEPTION][] = ['onException', 75]; - return $events; + if ($redirect_url) { + $event->setResponse(new RedirectResponse($redirect_url->toString())); + } } }