hn-8.x-1.x-dev/modules/hn_frontend/src/EventSubscriber/RedirectSubscriber.php

modules/hn_frontend/src/EventSubscriber/RedirectSubscriber.php
<?php

namespace Drupal\hn_frontend\EventSubscriber;

use Drupal\Core\Config\ConfigFactoryInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Event subscriber subscribing to KernelEvents::REQUEST.
 */
class RedirectSubscriber implements EventSubscriberInterface {

  /**
   * The user who is requesting a page.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $account;

  /**
   * The configFactory.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $config;

  /**
   * RedirectSubscriber constructor.
   */
  public function __construct(ConfigFactoryInterface $config_factory) {
    $this->config = $config_factory;
    $this->account = \Drupal::currentUser();
  }

  /**
   * Check if user has permissions to view the content else redirect.
   *
   * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
   *   The Response event.
   */
  public function checkAuthStatus(GetResponseEvent $event) {
    $route_name = \Drupal::routeMatch()->getRouteName();

    // When user is authenticated, the user can access.
    if ($route_name === NULL || $this->account->isAuthenticated()) {
      return;
    }

    $excluded_routes = $this->config->get('hn_frontend.settings')->get('routes');

    // Check if route matches with excluded routes.
    if ($this->inList($excluded_routes, $route_name)) {
      // If it is, we ignore this route and exit this function.
      return;
    }

    // Redirect the user to the login page.
    $response = new RedirectResponse('/user/login', 301);
    $event->setResponse($response);
    $event->stopPropagation();
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = ['checkAuthStatus'];
    $events[KernelEvents::EXCEPTION][] = ['checkAuthStatus'];
    return $events;
  }

  /**
   * Checks if $item is in $list.
   *
   * @param string[] $list
   *   A list of items that should return true. Can contain wildcards (*) and
   *   exclusions (~).
   * @param string $item
   *   The item to check against.
   *
   * @return bool
   *   TRUE of $item is in $list, FALSE if it isn't.
   */
  private function inList(array $list, $item) {
    // We reverse the list, so the latest in the list gets the most priority.
    $list = array_reverse($list);

    foreach ($list as $line) {
      // If the line starts with an ~, its an exclusion.
      $exclusion = substr($line, 0, 1) === '~';
      if ($exclusion) {
        $line = substr($line, 1);
      }

      // Change the line in something that can be thrown into a regex tester.
      $regexable = preg_quote($line, '/');

      // Change \* back into .*, so * can be used as a wildcard.
      $regexable = str_replace('\*', '.*', $regexable);
      if (preg_match('/^' . $regexable . '$/', $item)) {
        // We have a match!
        // Normally we would return true, but if it's an exclusion we return
        // need to return false.
        return !$exclusion;
      }
    }

    // If none of the lines match, it's not in the list.
    return FALSE;
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc