Auth-Filter leitet zurück zur ursprünglichen POST-Anfrage in Laravel

9

Es scheint, dass Redirect :: guest ('login') nur für GET-Anfragen funktioniert. Ie. Es leitet einen authentifizierten Benutzer zur ursprünglichen beabsichtigten URL (GET) um.

Gibt es in einer Situation, in der es eine POST-Anfrage gibt, eine Möglichkeit für den Authentifizierungsfilter, nach einer erfolgreichen Anmeldung des Benutzers mit POST zu einer URL fortzufahren?

Ein einfaches Beispiel: Ich möchte ein Formular anzeigen, das für jeden sichtbar ist. Wenn der Submit-Button gedrückt wird, wird der Auth-Filter aktiviert, der einen Gast auf die Anmeldeseite bringt. Nach erfolgreicher Authentifizierung möchte ich, dass die Übermittlungsanforderung (dh die POST-Anforderung) fortgesetzt wird.

    
mistermat 19.09.2013, 16:27
quelle

2 Antworten

10

Ich hatte den gleichen Wunsch, mit der ursprünglichen Eingabe zurück zu einer POST-Anfrage umzuleiten. Ich konnte in Laravel keinen bestehenden Weg finden, dies zu tun, außer dass ich über GET zu der beabsichtigten URL weitergeleitet werde.

Laravel 5

Ich habe das zuerst in Laravel 4 gelöst, indem ich der untenstehenden Gliederung folgte, aber in Laravel 5 das gleiche Setup nicht gefunden habe. Folge dem Umriss von Laravel 4, aber statt dem IntendedUrlServiceProvider eine Middleware zu erstellen.

  1. Das Problem ist, dass in Laravel 5 die Sitzung mit der StartSession gestartet wird, die hinter allen ServiceProvidern läuft.

/app/Http/Middleware/IntendedUrl.php

%Vor%
  1. Dann, anstatt den IntendedUrlServiceProvider wie in Schritt 4 hinzuzufügen, fügen Sie die neue Middleware nach der StartSession im $ Middleware Array von /app/Http/Kernel.php
  2. hinzu
%Vor%
  • Ebenfalls erwähnenswert, nur für die Organisation habe ich meine Kunden-Service-Provider auf den neuen Standard / App / Provider verschoben und ihren Namensraum geändert.

Laravel 4

Ich habe beschlossen, das Framework zu erweitern, um dieses Feature hinzuzufügen. Es wird schwierig sein, meine komplette Lösung zu beschreiben, aber hier ist ein Überblick. Um dies zu tun, müssen Sie sich mit dem Framework vertraut machen und sich darüber informieren, wie Sie es erweitern können. Ссылка

Ich erwähnte auch Taylors Buch "Laravel von Lehrling zu Artisan"

  1. Erweitern Sie die Redirector-Klasse, um zusätzliche Informationen zu der beabsichtigten Anforderung aufzuzeichnen.

    %Vor%
  2. Erstellen Sie einen neuen Service Provider, der über "redirect" in den IOC-Container schreibt. Ich habe ursprünglich versucht, den RoutingServiceProvider zu erweitern, hatte aber Probleme damit.

    %Vor%
  3. Erstellen Sie einen neuen Dienstanbieter, der die beabsichtigte Methode und die Eingabe nach der Weiterleitung festlegen wird.

    %Vor%
  4. Fügen Sie abschließend Ihrem Provider-Array in app / config / app.php

    Ihre zwei neuen Dienstanbieter hinzu %Vor%
Hoffentlich führt dich das in eine gute Richtung. Das hat für mich funktioniert, aber ich habe es nicht ausgiebig getestet. Vielleicht, wenn es weiterhin gut funktioniert, könnten wir ein Composer-Paket erstellen oder die Fähigkeit in Laravel integrieren.

    
Zack Huston 20.12.2013, 21:30
quelle
1

In Laravel 5.2 haben sie die Middleware-Gruppen implementiert und für neue Projekte die Standardgruppe "web" auf die gesamte Datei routes.php angewendet.

Das Problem:
Die Gruppen-Middleware wird aufgerufen, nachdem die Route festgelegt wurde, also durch einfaches Ändern der Methode der aktuellen Anfrage keine Wirkung hat.

Es gibt zwei verschiedene Ansätze, um es wieder an die Arbeit zu bringen (ich schlage Nr. 2 vor)


Lösung 1:
Setzen Sie die Session und die beabsichtigte URL-Middleware zurück in das globale Middleware-Array in der Datei Kernel.php - Das ist einfach und es würde funktionieren, aber manchmal haben Sie neben Ihrem Projekt einige REST-API Routen und imho eine Session hat dort nichts zu tun.


Lösung 2:
Fügen Sie die beabsichtigte URL-Klasse nach der ShareErrorsFromSession-Klasse in der Webgruppe ein und übernehmen Sie die Datei wie folgt:

%Vor%

Durch das Senden der geänderten Anforderungen brechen wir den aktuellen Lebenszyklus und rufen einen neuen auf, so dass die richtige Route verwendet wird und wie erwartet funktioniert. Der zweite Ansatz gibt uns auch die Möglichkeit, die Intended-URL-Funktionalität nur für ausgewählte Routen zu definieren, wenn Sie das möchten.

    
Munsio 20.07.2016 07:09
quelle