Anonymen Benutzer zur Anmeldeseite umleiten

13

Ich möchte, dass der Benutzer nicht angemeldet ist und eine Seite meiner Website mit Ausnahme meiner REST VIEWS-Router besucht. Ich leite ihn / sie zur Anmeldeseite in Drupal 8 weiter. Ich habe diese Lösung für Drupal 7 gefunden, aber keine Lösung für Drupal 8 gefunden.

David Mcsmith
quelle
2
Im Code würden Sie einen Ereignisabonnenten schreiben, um auf ein Ereignis zu KernelEvents::REQUESTreagieren, und dann die Antwort auf eine RedirectResponse für die Anmeldeseite festlegen.
Mradcliffe
1
Ich dachte an etwas anderes. Sie könnten die 403-Seite auf setzen /userund dann, wenn sie anonym sind, auf /user/login, aber mit dem Nebeneffekt, dass authentifizierte Benutzer in ihr Benutzerprofil aufgenommen werden, ohne ihnen mitzuteilen, dass ihnen der Zugriff auf die von ihnen gesuchte Seite verweigert wurde .
Mradcliffe
1
Verwenden Sie das folgende Modul, um eine Anmeldeumleitung für anonyme Benutzer hinzuzufügen. Es enthält eine Einstellung zum Ausschließen von Pfaden, damit Sie Ihrer Meinung nach Ihre Ruhepfade hinzufügen können. drupal.org/project/anonymous_redirect
Daniel Harper
1
Dieses Modul erledigt auch die Aufgabe: drupal.org/project/anonymous_login
Joris Lucius

Antworten:

19

Sie können den Status eines Benutzers sehr früh mit einem Ereignisabonnenten in einem benutzerdefinierten Modul testen, das KernelEvents :: REQUEST abonniert.

Zunächst registrieren Sie den Ereignis-Abonnenten mymodule.services.ymlin Ihrem Modulordner:

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

Fügen Sie dann RedirectAnonymousSubscriber.php für Ihren benutzerdefinierten Ereignisabonnenten in Ihrem Modul den /src/EventSubscriber/Ordner hinzu.

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
quelle
danke an @mradcliffe für die idee für den
eventteilnehmer
1
er sollte schaffen RedirectAnonymousSubscriber.php, ich aktualisiere deine antwort.
Yusef
@oknate was ist, wenn der Benutzer sich auf / registration oder / forget-password oder / logout route befindet? Sollte es nicht auch nach diesen Routen im if-Zustand suchen? In diesem Fall wird der Benutzer möglicherweise umgeleitet, während er sich registriert oder ein neues Kennwort anfordert.
Juyal Jee
1
Ein weiteres wichtiges Detail ist hierbei die "Priorität" des Teilnehmers. Ich habe festgestellt, dass einige Routen aufgelöst werden, bevor die oben genannte Umleitung aktiviert wird. Das Festlegen der Priorität (eine höhere Anzahl wird zuerst ausgelöst) hilft jedoch, dies zu beheben. Verwenden Sie im obigen Beispiel array ('checkAuthStatus', 100). Dokumente
BWagner vor
5

Erstellen Sie zunächst einen Dienst für Ihren Veranstaltungsteilnehmer in module-name.services.yml

Code -

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

Erstellen Sie Ihre eigene eventsubscriber-Klasse im modules/module-name/src/EventSubscriberVerzeichnis:

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
quelle
4

Unter Drupal 8.3.3 führt dieser Code zu einer endlosen Umleitung. Ich habe das behoben, indem ich das stattdessen hinzufügte.

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