6b738c8c3d3d4ed7743a884eac2ef1cc755b2b5e
[yaffs-website] / web / core / modules / user / src / EventSubscriber / AccessDeniedSubscriber.php
1 <?php
2
3 namespace Drupal\user\EventSubscriber;
4
5 use Drupal\Core\Session\AccountInterface;
6 use Drupal\Core\Routing\RouteMatch;
7 use Drupal\Core\Routing\UrlGeneratorTrait;
8 use Drupal\Core\Routing\UrlGeneratorInterface;
9 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
10 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
11 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
12 use Symfony\Component\HttpKernel\KernelEvents;
13
14 /**
15  * Redirects users when access is denied.
16  *
17  * Anonymous users are taken to the login page when attempting to access the
18  * user profile pages. Authenticated users are redirected from the login form to
19  * their profile page and from the user registration form to their profile edit
20  * form.
21  */
22 class AccessDeniedSubscriber implements EventSubscriberInterface {
23
24   use UrlGeneratorTrait;
25
26   /**
27    * The current user.
28    *
29    * @var \Drupal\Core\Session\AccountInterface
30    */
31   protected $account;
32
33   /**
34    * Constructs a new redirect subscriber.
35    *
36    * @param \Drupal\Core\Session\AccountInterface $account
37    *   The current user.
38    * @param \Drupal\Core\Routing\UrlGeneratorInterface $url_generator
39    *   The URL generator.
40    */
41   public function __construct(AccountInterface $account, UrlGeneratorInterface $url_generator) {
42     $this->account = $account;
43     $this->setUrlGenerator($url_generator);
44   }
45
46   /**
47    * Redirects users when access is denied.
48    *
49    * @param \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event
50    *   The event to process.
51    */
52   public function onException(GetResponseForExceptionEvent $event) {
53     $exception = $event->getException();
54     if ($exception instanceof AccessDeniedHttpException) {
55       $route_name = RouteMatch::createFromRequest($event->getRequest())->getRouteName();
56       if ($this->account->isAuthenticated()) {
57         switch ($route_name) {
58           case 'user.login';
59             // Redirect an authenticated user to the profile page.
60             $event->setResponse($this->redirect('entity.user.canonical', ['user' => $this->account->id()]));
61             break;
62
63           case 'user.register';
64             // Redirect an authenticated user to the profile form.
65             $event->setResponse($this->redirect('entity.user.edit_form', ['user' => $this->account->id()]));
66             break;
67         }
68       }
69       elseif ($route_name === 'user.page') {
70         $event->setResponse($this->redirect('user.login'));
71       }
72     }
73   }
74
75   /**
76    * {@inheritdoc}
77    */
78   public static function getSubscribedEvents() {
79     // Use a higher priority than
80     // \Drupal\Core\EventSubscriber\ExceptionLoggingSubscriber, because there's
81     // no need to log the exception if we can redirect.
82     $events[KernelEvents::EXCEPTION][] = ['onException', 75];
83     return $events;
84   }
85
86 }