Перенаправить анонимного пользователя на страницу входа

14

Я хочу, чтобы, если пользователь не вошел в систему и не посетил какую-либо страницу моего сайта, кроме маршрутизаторов REST VIEWS, я перенаправил его / ее на страницу входа в drupal 8, я нашел это решение для drupal 7, но не нашел никакого решения для Drupal 8,

Дэвид Максмит
источник
2
В коде вы должны написать подписчика события, чтобы он действовал на KernelEvents::REQUESTсобытие, а затем установить ответ на RedirectResponse для страницы входа.
Мрадклифф
1
Я думал о чем-то еще. Вы можете установить страницу 403, /userа затем, если они будут анонимными, это приведет к ним /user/login, но с побочным эффектом перехода аутентифицированных пользователей в их профили пользователей, не сообщая им, что им было отказано в доступе к странице, которую они искали. ,
Мрадклифф
1
Используйте следующий модуль для добавления перенаправления входа для анонимных пользователей, в нем есть настройка для исключения путей, поэтому я думаю, что вы можете добавить в нее свои пути отдыха. drupal.org/project/anonymous_redirect
Даниэль Харпер
1
Этот модуль также выполняет свою работу: drupal.org/project/anonymous_login
Joris Lucius

Ответы:

21

Вы можете проверить статус пользователя очень рано с подписчиком на событие в пользовательском модуле, который подписывается на KernelEvents :: REQUEST.

Сначала вы регистрируете подписчика на события mymodule.services.ymlв папке вашего модуля:

services:
  mymodule.event_subscriber:
    class: Drupal\mymodule\EventSubscriber\RedirectAnonymousSubscriber
    arguments: []
    tags:
      - {name: event_subscriber}

Затем добавьте RedirectAnonymousSubscriber.php для своего пользовательского события подписчика в свой модуль в /src/EventSubscriber/папке.

namespace Drupal\mymodule\EventSubscriber;

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 RedirectAnonymousSubscriber implements EventSubscriberInterface {

  public function __construct() {
    $this->account = \Drupal::currentUser();
  }

  public function checkAuthStatus(GetResponseEvent $event) {

    if ($this->account->isAnonymous() && \Drupal::routeMatch()->getRouteName() != 'user.login') {

      // add logic to check other routes you want available to anonymous users,
      // otherwise, redirect to login page.
      $route_name = \Drupal::routeMatch()->getRouteName();
      if (strpos($route_name, 'view') === 0 && strpos($route_name, 'rest_') !== FALSE) {
        return;
      }

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

  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('checkAuthStatus');
    return $events;
  }

}
oknate
источник
спасибо @mradcliffe за идею для подписчика на мероприятие
oknate
1
он должен создать RedirectAnonymousSubscriber.php, я обновлю твой ответ.
Юсеф
@oknate что если пользователь находится на / регистрация или / забыть-пароль или / выход из системы? Разве он не должен проверять эти маршруты и в условиях if? В соответствии с этим, пользователь может быть перенаправлен при регистрации или запросить новый пароль.
Джуал Джи
2
Еще одной важной деталью здесь является «приоритет» абонента. Я обнаружил, что некоторые маршруты разрешатся до того, как перенаправление выше активируется. Но установка приоритета (сначала запускается большее число) помогает решить эту проблему. В приведенном выше примере используйте массив ('checkAuthStatus', 100). Документы на подписчика и приоритет: symfony.com/doc/current/event_dispatcher.html
BWagner
6

На Drupal 8.3.3 этот код вызывает бесконечное перенаправление. Я исправил это, добавив это вместо этого.

..
$response = new RedirectResponse('/user/login', 301);
$response->send();
..
GH
источник
6

Сначала создайте сервис для вашего подписчика module-name.services.yml

Код -

services:
    [MODULE-NAME]_event_subscriber:
        class: Drupal\MODULE-NAME\EventSubscriber\[Event-Subscriber-class]
        tags:
        - {name: event_subscriber}

Создайте свой собственный класс eventsubscriber внутри modules/module-name/src/EventSubscriberкаталога:

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;

class Event-Subscriber-class implements EventSubscriberInterface {

  private $redirectCode = 301;

  public function checkForRedirection2(GetResponseEvent $event) {
    $account = \Drupal::currentUser(); 
    if (empty($account->id()) {
      $response = new RedirectResponse('/', $this->redirectCode);
      $response->send();
      exit(0);
    }
  }

  public static function getSubscribedEvents() {
    $events[KernelEvents::REQUEST][] = array('checkForRedirection2');
    return $events;
  }
}
Ашиш Дейнап
источник