R4032LoginSubscriber.php in Redirect 403 to User Login 8
File
src/EventSubscriber/R4032LoginSubscriber.php
View source
<?php
namespace Drupal\r4032login\EventSubscriber;
use Drupal\Component\Utility\UrlHelper;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
use Drupal\Core\Path\PathMatcherInterface;
use Drupal\Core\Routing\TrustedRedirectResponse;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
use Drupal\r4032login\Event\RedirectEvent;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Drupal\Component\Utility\Xss;
class R4032LoginSubscriber extends HttpExceptionSubscriberBase {
protected $configFactory;
protected $currentUser;
protected $requestStack;
protected $pathMatcher;
protected $eventDispatcher;
public function __construct(ConfigFactoryInterface $config_factory, AccountInterface $current_user, RequestStack $request_stack, PathMatcherInterface $path_matcher, EventDispatcherInterface $event_dispatcher) {
$this->configFactory = $config_factory;
$this->currentUser = $current_user;
$this->requestStack = $request_stack;
$this->pathMatcher = $path_matcher;
$this->eventDispatcher = $event_dispatcher;
}
protected function getHandledFormats() {
return [
'html',
];
}
public function on403(GetResponseEvent $event) {
$config = $this->configFactory
->get('r4032login.settings');
$currentPath = $this->requestStack
->getCurrentRequest()
->getPathInfo();
if (($noRedirectPages = trim($config
->get('match_noredirect_pages'))) && $this->pathMatcher
->matchPath($currentPath, $noRedirectPages)) {
return;
}
if ($this->currentUser
->isAnonymous()) {
$redirectPath = $config
->get('user_login_path');
}
else {
$redirectPath = $config
->get('redirect_authenticated_users_to');
}
if (!empty($redirectPath)) {
$externalRedirect = UrlHelper::isExternal($redirectPath);
$options = [
'absolute' => TRUE,
];
if ($config
->get('redirect_to_destination')) {
if ($externalRedirect) {
$destination = Url::fromUserInput($currentPath, [
'absolute' => TRUE,
])
->toString();
}
else {
$destination = substr($currentPath, 1);
}
if ($queryString = $this->requestStack
->getCurrentRequest()
->getQueryString()) {
$destination .= '?' . $queryString;
}
if (empty($config
->get('destination_parameter_override'))) {
$options['query']['destination'] = $destination;
}
else {
$options['query'][$config
->get('destination_parameter_override')] = $destination;
}
}
$redirectEvent = new RedirectEvent($redirectPath, $options);
$this->eventDispatcher
->dispatch(RedirectEvent::EVENT_NAME, $redirectEvent);
$redirectPath = $redirectEvent
->getUrl();
$options = $redirectEvent
->getOptions();
if ($externalRedirect) {
$url = Url::fromUri($redirectPath, $options)
->toString();
$response = new TrustedRedirectResponse($url);
}
else {
if ($this->currentUser
->isAnonymous() && $config
->get('display_denied_message')) {
$message = $config
->get('access_denied_message');
$messageType = $config
->get('access_denied_message_type');
drupal_set_message(Xss::filterAdmin($message), $messageType);
}
if ($redirectPath === '<front>') {
$url = \Drupal::urlGenerator()
->generate('<front>');
}
else {
$url = Url::fromUserInput($redirectPath, $options)
->toString();
}
$code = $config
->get('default_redirect_code');
$response = new RedirectResponse($url, $code);
}
$event
->setResponse($response);
}
}
}