Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 40 |
| AuthenticationSubscriber | |
0.00% |
0 / 1 |
|
0.00% |
0 / 5 |
462 | |
0.00% |
0 / 40 |
| __construct | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 5 |
|||
| onKernelRequestAuthenticate | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 12 |
|||
| onKernelRequestFilterProvider | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 7 |
|||
| onExceptionSendChallenge | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 11 |
|||
| getSubscribedEvents | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 5 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\Core\EventSubscriber\AuthenticationSubscriber. | |
| */ | |
| namespace Drupal\Core\EventSubscriber; | |
| use Drupal\Core\Authentication\AuthenticationProviderFilterInterface; | |
| use Drupal\Core\Authentication\AuthenticationProviderChallengeInterface; | |
| use Drupal\Core\Authentication\AuthenticationProviderInterface; | |
| use Drupal\Core\Session\AccountProxyInterface; | |
| use Symfony\Component\EventDispatcher\EventSubscriberInterface; | |
| use Symfony\Component\HttpKernel\Event\GetResponseEvent; | |
| use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; | |
| use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; | |
| use Symfony\Component\HttpKernel\HttpKernelInterface; | |
| use Symfony\Component\HttpKernel\KernelEvents; | |
| /** | |
| * Authentication subscriber. | |
| * | |
| * Trigger authentication during the request. | |
| */ | |
| class AuthenticationSubscriber implements EventSubscriberInterface { | |
| /** | |
| * Authentication provider. | |
| * | |
| * @var \Drupal\Core\Authentication\AuthenticationProviderInterface | |
| */ | |
| protected $authenticationProvider; | |
| /** | |
| * Authentication provider filter. | |
| * | |
| * @var \Drupal\Core\Authentication\AuthenticationProviderFilterInterface|NULL | |
| */ | |
| protected $filter; | |
| /** | |
| * Authentication challenge provider. | |
| * | |
| * @var \Drupal\Core\Authentication\AuthenticationProviderChallengeInterface|NULL | |
| */ | |
| protected $challengeProvider; | |
| /** | |
| * Account proxy. | |
| * | |
| * @var \Drupal\Core\Session\AccountProxyInterface | |
| */ | |
| protected $accountProxy; | |
| /** | |
| * Constructs an authentication subscriber. | |
| * | |
| * @param \Drupal\Core\Authentication\AuthenticationProviderInterface $authentication_provider | |
| * An authentication provider. | |
| * @param \Drupal\Core\Session\AccountProxyInterface $account_proxy | |
| * Account proxy. | |
| */ | |
| public function __construct(AuthenticationProviderInterface $authentication_provider, AccountProxyInterface $account_proxy) { | |
| $this->authenticationProvider = $authentication_provider; | |
| $this->filter = ($authentication_provider instanceof AuthenticationProviderFilterInterface) ? $authentication_provider : NULL; | |
| $this->challengeProvider = ($authentication_provider instanceof AuthenticationProviderChallengeInterface) ? $authentication_provider : NULL; | |
| $this->accountProxy = $account_proxy; | |
| } | |
| /** | |
| * Authenticates user on request. | |
| * | |
| * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event | |
| * The request event. | |
| * | |
| * @see \Drupal\Core\Authentication\AuthenticationProviderInterface::authenticate() | |
| */ | |
| public function onKernelRequestAuthenticate(GetResponseEvent $event) { | |
| if ($event->getRequestType() === HttpKernelInterface::MASTER_REQUEST) { | |
| $request = $event->getRequest(); | |
| if ($this->authenticationProvider->applies($request)) { | |
| $account = $this->authenticationProvider->authenticate($request); | |
| if ($account) { | |
| $this->accountProxy->setAccount($account); | |
| return; | |
| } | |
| } | |
| // No account has been set explicitly, initialize the timezone here. | |
| date_default_timezone_set(drupal_get_user_timezone()); | |
| } | |
| } | |
| /** | |
| * Denies access if authentication provider is not allowed on this route. | |
| * | |
| * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event | |
| * The request event. | |
| */ | |
| public function onKernelRequestFilterProvider(GetResponseEvent $event) { | |
| if (isset($this->filter) && $event->getRequestType() === HttpKernelInterface::MASTER_REQUEST) { | |
| $request = $event->getRequest(); | |
| if ($this->authenticationProvider->applies($request) && !$this->filter->appliesToRoutedRequest($request, TRUE)) { | |
| throw new AccessDeniedHttpException(); | |
| } | |
| } | |
| } | |
| /** | |
| * Respond with a challenge on access denied exceptions if appropriate. | |
| * | |
| * On a 403 (access denied), if there are no credentials on the request, some | |
| * authentication methods (e.g. basic auth) require that a challenge is sent | |
| * to the client. | |
| * | |
| * @param \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event | |
| * The exception event. | |
| */ | |
| public function onExceptionSendChallenge(GetResponseForExceptionEvent $event) { | |
| if (isset($this->challengeProvider) && $event->getRequestType() === HttpKernelInterface::MASTER_REQUEST) { | |
| $request = $event->getRequest(); | |
| $exception = $event->getException(); | |
| if ($exception instanceof AccessDeniedHttpException && !$this->authenticationProvider->applies($request) && (!isset($this->filter) || $this->filter->appliesToRoutedRequest($request, FALSE))) { | |
| $challenge_exception = $this->challengeProvider->challengeException($request, $exception); | |
| if ($challenge_exception) { | |
| $event->setException($challenge_exception); | |
| } | |
| } | |
| } | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function getSubscribedEvents() { | |
| // The priority for authentication must be higher than the highest event | |
| // subscriber accessing the current user. Especially it must be higher than | |
| // LanguageRequestSubscriber as LanguageManager accesses the current user if | |
| // the language module is enabled. | |
| $events[KernelEvents::REQUEST][] = ['onKernelRequestAuthenticate', 300]; | |
| // Access check must be performed after routing. | |
| $events[KernelEvents::REQUEST][] = ['onKernelRequestFilterProvider', 31]; | |
| $events[KernelEvents::EXCEPTION][] = ['onExceptionSendChallenge', 75]; | |
| return $events; | |
| } | |
| } |