Przekieruj anonimowego użytkownika na stronę logowania

14

Chcę, jeśli użytkownik nie zaloguje się i nie wejdzie na żadną stronę mojej witryny oprócz routerów REST VIEWS Przekieruję go na stronę logowania w Drupal 8, znalazłem to rozwiązanie dla Drupal 7, ale nie znalazłem żadnego rozwiązania dla Drupal 8,

David Mcsmith
źródło
2
W kodzie napisałbyś subskrybenta zdarzenia, aby działał na KernelEvents::REQUESTzdarzeniu, a następnie ustawiłeś odpowiedź na odpowiedź RedirectResponse dla strony logowania.
mradcliffe,
1
Myślałem o czymś innym. Możesz ustawić stronę 403 na, /usera jeśli są anonimowi, zabierze ich to /user/login, ale z efektem ubocznym przeniesienia uwierzytelnionych użytkowników do ich profilu użytkownika bez informowania ich, że odmówiono im dostępu do strony, której szukali .
mradcliffe
1
Użyj poniższego modułu, aby dodać przekierowanie logowania dla anonimowych użytkowników, ma ustawienie wykluczania ścieżek, więc myślę, że możesz w tym dodać ścieżki odpoczynku. drupal.org/project/anonymous_redirect
Daniel Harper
1
Moduł wykonuje również zadanie: drupal.org/project/anonymous_login
Joris Lucius

Odpowiedzi:

21

Możesz bardzo wcześnie przetestować status użytkownika z subskrybentem zdarzenia w niestandardowym module, który subskrybuje KernelEvents :: REQUEST.

Najpierw zarejestruj subskrybenta zdarzenia w mymodule.services.ymlfolderze modułu:

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

Następnie dodaj RedirectAnonymousSubscriber.php niestandardowego subskrybenta zdarzenia w swoim module w /src/EventSubscriber/folderze.

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
źródło
dzięki @mradcliffe za pomysł dla subskrybenta wydarzenia
oknate
1
powinien stworzyć RedirectAnonymousSubscriber.php, zaktualizuję twoją odpowiedź.
Yusef
@oknate co jeśli użytkownik jest na / rejestracji lub / zapomniałeś hasła lub / wylogowałeś się? Czy nie powinien sprawdzać również tych tras w warunku if? Zgodnie z tym użytkownik może zostać przekierowany podczas rejestracji lub poprosić o nowe hasło.
Juyal Jee,
2
Kolejnym ważnym szczegółem jest tutaj „priorytet” subskrybenta. Odkryłem, że niektóre trasy zostaną rozwiązane przed uruchomieniem przekierowania powyżej. Ale ustawienie priorytetu (najpierw większa liczba odpaleń) pomaga rozwiązać ten problem. W powyższym przykładzie użyj tablicy ('checkAuthStatus', 100). Dokumenty dotyczące subskrybenta i priorytetu: symfony.com/doc/current/event_dispatcher.html
BWagner
6

W Drupal 8.3.3 ten kod powoduje niekończące się przekierowanie. Naprawiłem to, dodając zamiast tego.

..
$response = new RedirectResponse('/user/login', 301);
$response->send();
..
GH
źródło
6

Najpierw utwórz usługę dla subskrybenta wydarzenia w module-name.services.yml

Kod -

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

Utwórz własną klasę subskrybentów zdarzeń w modules/module-name/src/EventSubscriberkatalogu:

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;
  }
}
Ashish Deynap
źródło