Перенаправити анонімного користувача на сторінку входу


14

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


2
У коді ви можете написати абоненту події, щоб діяти на KernelEvents::REQUESTподію, а потім встановити відповідь на RedirectResponse для сторінки входу.
mradcliffe

1
Я придумав щось інше. Ви можете встановити сторінку 403, /userа потім, якщо вони будуть анонімними, це займе їх /user/login, але з побічним ефектом перенесення автентифікованих користувачів у їх профіль користувача, не повідомляючи їм, що їм заборонено доступ до сторінки, яку вони шукали. .
mradcliffe

1
Використовуйте наступний модуль, щоб додати переадресацію для анонімних користувачів, він має налаштування для виключення шляхів, тому я думаю, ви можете додати свої шляхи відпочинку в цьому. drupal.org/project/anonymous_redirect
Даніель Харпер

1
Цей модуль також виконує завдання: drupal.org/project/anonymous_login
Joris Lucius

Відповіді:


21

Ви можете перевірити статус користувача дуже рано, підписавшись на подію у спеціальному модулі, який підписався на KernelEvents :: ЗАПИТАННЯ.

Спочатку ви реєструєте абонента події у 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;
  }

}

дякую @mradcliffe за ідею для абонента події
oknate

1
він повинен створити RedirectAnonymousSubscriber.php, я оновлюю вашу відповідь.
Юсеф

@oknate що робити, якщо користувач перебуває на / реєстрації або / забуття пароля чи / вихід із маршруту? Чи не повинен він перевіряти ці маршрути також у випадку if? Відповідно до цього, користувач може перенаправлятись під час реєстрації або запиту нового пароля.
Juyal Jee

2
Ще одна важлива деталь тут - «пріоритетність» абонента. Я виявив, що деякі маршрути будуть вирішені до того, як переадресація буде розпочата вище. Але встановлення пріоритету (спочатку спрацьовує більша кількість) допомагає вирішити це. У наведеному вище прикладі використовуйте масив ('checkAuthStatus', 100). Документи щодо передплатників та пріоритет: symfony.com/doc/current/event_dispatcher.html
BWagner

6

У Drupal 8.3.3 цей код викликає нескінченне перенаправлення. Я це виправив, додавши це замість цього.

..
$response = new RedirectResponse('/user/login', 301);
$response->send();
..

6

По-перше, створіть послугу для свого абонента в module-name.services.yml

Код -

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

Створіть власний клас передплатників подій всередині 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;
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.