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 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('', [], ['absolute' => TRUE]); } if ($redirect_url) { $event->setResponse(new RedirectResponse($redirect_url->toString())); } } }