Ich möchte einen anonymen Benutzer zum Anmeldeformular umleiten, wenn dieser Benutzer auf einen 403-Fehler stößt.
Ich habe einen Ereignis-Abonnenten erstellt und dies ist mein Code, aber ich lande in einer Schleife auf der aktuellen Seite.
/**
* Redirect anonymous user to login page if he encounters 404 or 403
* response.
*
* @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $response
* The created response object that will be returned.
* @param string $event
* The string representation of the event.
* @param \Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher $event_dispatcher
* Event dispatcher that lazily loads listeners and subscribers from the dependency injection
* container.
*/
public function checkLoginNeeded(GetResponseEvent $response, $event, ContainerAwareEventDispatcher $event_dispatcher) {
$routeMatch = RouteMatch::createFromRequest($response->getRequest());
$route_name = $routeMatch->getRouteName();
$is_anonymous = \Drupal::currentUser()->isAnonymous();
$is_not_login = $route_name != 'user.login';
if ($is_anonymous && $route_name == 'system.403' && $is_not_login) {
$query = $response->getRequest()->query->all();
// $query['destination'] = $routeMatch->getRouteObject()->getPath();
$query['destination'] = \Drupal::url('<current>');
$login_uri = \Drupal::url('user.login', [], ['query' => $query]);
$returnResponse = new RedirectResponse($login_uri, Response::HTTP_FOUND);
$response->setResponse($returnResponse);
}
}
Ich denke, das hängt damit zusammen, dass die Antwort bereits das Ziel (aktuelle URL) enthält und System.404 und System.403 eine hohe Priorität haben, die mich daran hindert, dies außer Kraft zu setzen.
8
routes
redirection
Pierre.Vriens
quelle
quelle
Antworten:
Der einfachste Weg ist zu durchsuchen zu
/admin/config/system/site-information
und füllen Sie das Feld , das liestDefault 403 (access denied) page
mituser/login
quelle
Ich habe gesehen, dass diese Frage nie programmatisch beantwortet wurde. Der Code funktioniert tatsächlich, wenn er in einem Ausnahmeabonnement abgelegt wird:
/src/EventSubscriber/RedirectOn403Subscriber.php:
mymodule.services.yml:
quelle
Wenn Sie sich nur den Titel dieser Frage ansehen (= Wie leite ich den Benutzer von 403 aus zum Anmeldeformular um? ), Gibt es zwei Möglichkeiten, dies zu tun, ohne dass ein benutzerdefinierter Code erforderlich ist (siehe unten).
Option 1: Verwenden Sie das CustomError-Modul
Mit dem CustomError- Modul kann der Site-Administrator benutzerdefinierte Fehlerseiten für die HTTP-Statuscodes 403 (Zugriff verweigert) und 404 (nicht gefunden) erstellen, ohne Knoten für jeden von ihnen zu erstellen. Einige weitere Details zu seinen Funktionen (von seiner Projektseite):
Sie interessieren sich wahrscheinlich hauptsächlich für den Teil " Benutzer, die nicht angemeldet sind und versuchen, auf einen Bereich zuzugreifen, für den eine Anmeldung erforderlich ist, werden nach der Anmeldung zu der Seite umgeleitet, auf die sie zugreifen wollten. "
Für D8 ist auch eine 8.x-1.x-dev-Version für dieses Modul verfügbar. Weitere Informationen hierzu finden Sie in Ausgabe 2219227 .
Option 2: Verwenden Sie das Modul Regeln
Angenommen, der Pfad der Seite "Standard 403" lautet
no_access
(über admin). Erstellen Sie dann eine Regel mit dem Modul Regeln , und geben Sie als Ereignis "Nach dem Besuch des Knotensno_access
" ein. Damit die gesamte Regel ungefähr so aussieht:no_access
Bedingungen:
Parameter: User: [site:current-user], Roles: anonymous user
Parameter: Text: [site:current-page:url], Matching text: user/login
Aktionen: Seitenumleitung -
Parameter: URL: user/login
Wenn Sie dies möchten, können Sie sogar eine weitere Aktion hinzufügen, um auch eine (informative) Nachricht im Drupal-Nachrichtenbereich anzuzeigen, z. B. "Sie haben versucht, eine Seite zu besuchen, für die eine Anmeldung erforderlich ist ...".
Richtig, möglicherweise müssen Sie ein zusätzliches Modul ( Regeln ) aktivieren . Wie die wachsende Popularität des Moduls zeigt, ist dieses wahrscheinlich bereits in fast jeder Site aktiviert (ähnlich wie das Views- Modul), da es Dutzende Anwendungsfälle für dieses Modul gibt.
Für D8 gibt es eine 8.x-3.x-alfa1- Version für dieses Modul. Weitere Informationen zu seiner D8-Version finden Sie in Ausgabe 2574691 , die einen Link zur Regelausgabe " Rules 8.x Roadmap " enthält.
Wenn das oben Genannte nicht hilft, möchten Sie möglicherweise überprüfen, ob der Grund für Ihre Schleife (oder "eine hohe Priorität" wie in Ihrer Frage) nicht durch etwas ähnliches wie die Antwort auf die Frage " Wie spezifizieren " verhindert / erklärt werden kann Ein Regelereignis wie "Inhalt wird angezeigt"? ".
quelle
Ich denke, die Lösung für Ihr Problem ist einfach. Sie können ganz einfach eine benutzerdefinierte Seite für diese Seite erstellen
404
und403
dann anonyme Benutzer auf diese Seite umleiten/user
.Sie können diesen Code verwenden
Wann immer 404 auftritt, wird Ihr
page--404.tpl.php
verwendet. Verwenden Sie auf dieser Seite diesen CodeAuf der Seite Erstellen von benutzerdefinierten 403- und 404-Seiten in Drupal wird eine weitere Methode zum Erstellen einer Seite für
403
und erläutert404
.quelle
8
Format ändernAm einfachsten geht das mit dem Redirect 403 to User Login- Modul (für D8 gibt es eine Dev-Version davon). Hier ist ein Zitat darüber (von seiner Projektseite):
quelle
7
und6
(1) Erstellen Sie einen Seitenknoten mit einem Alias "/my403.html".
(2) Gehen Sie zu / admin / config / system / site-information und setzen Sie "/my403.html" als 403-Errorpage
(3) Gehen Sie zu / admin / structure / block und fügen Sie den Block "Benutzeranmeldung" (Sec. Forms) zum Hauptinhaltsbereich hinzu. Beschränken Sie das Erscheinungsbild des Blocks auf die Seite "my403.html" und die Rolle "guest".
Das ist es.
Wenn Sie mehr Kontrolle benötigen, erstellen Sie einen Controller für Ihre 403-Seite und fügen Sie das UserLoginForm manuell hinzu.
Viele Grüße, Rainer
quelle