Ich habe kürzlich ein neues Laravel-Projekt erstellt und bin dem Leitfaden zur Authentifizierung gefolgt. Wenn ich entweder meine Login- oder Registrierungsroute besuche, wird folgende Fehlermeldung angezeigt:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
Ich habe keine Laravel-Kerndateien bearbeitet, sondern nur die Ansichten erstellt und die Routen zu meiner Datei route.php hinzugefügt
// Authentication routes
Route::get('auth/login', ['uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Route::post('auth/login', ['uses' => 'Auth\AuthController@postLogin', 'as' => 'login']);
Route::get('auth/logout', ['uses' => 'Auth\AuthController@getLogout', 'as' => 'logout']);
// Registration routes
Route::get('auth/register', ['uses' => 'Auth\AuthController@getRegister', 'as' => 'register']);
Route::post('auth/register', ['uses' => 'Auth\AuthController@postRegister', 'as' => 'login']);
Ich habe nicht viel Erfahrung mit Laravel, bitte entschuldigen Sie meine Unwissenheit. Ich bin mir bewusst, dass es eine andere Frage gibt , die dasselbe stellt, aber keine der Antworten scheint für mich zu funktionieren. Danke fürs Lesen!
Bearbeiten:
Hier ist meine register.blade.php wie gewünscht.
@extends('partials.main')
@section('title', 'Test | Register')
@section('content')
<form method="POST" action="/auth/register">
{!! csrf_field() !!}
<div class="ui input">
<input type="text" name="name" value="{{ old('name') }}" placeholder="Username">
</div>
<div class="ui input">
<input type="email" name="email" value="{{ old('email') }}" placeholder="Email">
</div>
<div class="ui input">
<input type="password" name="password" placeholder="Password">
</div>
<div class="ui input">
<input type="password" name="password_confirmation"placeholder="Confirm Password">
</div>
<div>
<button class="ui primary button" type="submit">Register</button>
</div>
</form>
@endsection
Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController', ]);
Antworten:
Sie müssen die Web-Middleware verwenden, wenn Sie Sitzungsstatus, CSRF-Schutz und mehr benötigen.
quelle
php artisan key:generate
Wenn das Hinzufügen Ihres
routes
Inside theweb middleware
aus irgendeinem Grund nicht funktioniert, versuchen Sie, dies$middleware
in hinzuzufügenKernel.php
quelle
In meinem Fall (unter Verwendung von Laravel 5.3) konnte ich durch Hinzufügen der folgenden 2 Middleware auf Sitzungsdaten in meinen API-Routen zugreifen:
\App\Http\Middleware\EncryptCookies::class
\Illuminate\Session\Middleware\StartSession::class
Ganze Deklaration (
$middlewareGroups
in Kernel.php):quelle
Wenn die Antwort von Cas Bloem nicht zutrifft (dh Sie haben definitiv die
web
Middleware auf der entsprechenden Route), möchten Sie möglicherweise die Reihenfolge der Middleware in Ihrem HTTP-Kernel überprüfen.Die Standardreihenfolge
Kernel.php
lautet wie folgt:Beachten Sie, dass danach
VerifyCsrfToken
kommtStartSession
. Wenn Sie diese in einer anderen Reihenfolge haben, kann die Abhängigkeit zwischen ihnen auch zurSession store not set on request.
Ausnahme führen.quelle
Ein Problem kann sein, dass Sie versuchen, innerhalb der
__constructor()
Funktion Ihres Controllers auf Ihre Sitzung zuzugreifen .Ab Laravel 5.3+ ist dies nicht mehr möglich, da es ohnehin nicht funktionieren soll, wie im Upgrade-Handbuch angegeben .
Für weitere Hintergrundinformationen lesen Sie auch Taylor seine Antwort.
Problemumgehung
Wenn Sie dies weiterhin verwenden möchten, können Sie dynamisch eine Middleware erstellen und im Konstruktor ausführen, wie im Upgrade-Handbuch beschrieben:
quelle
Laravel [5.4]
Meine Lösung bestand darin, den globalen Sitzungshelfer zu verwenden: session ()
Seine Funktionalität ist etwas schwieriger als $ request-> session () .
Schreiben :
Drücken :
Abrufen :
quelle
In meinem Fall habe ich $ middlewareGroups (in app / Http / Kernel.php) die folgenden 4 Zeilen hinzugefügt:
WICHTIG: Die 4 neuen Zeilen müssen VOR "Gas" und "Bindungen" hinzugefügt werden!
Andernfalls tritt der Fehler "CSRF-Token stimmt nicht überein" auf. Ich habe mehrere Stunden damit zu kämpfen, nur um herauszufinden, dass die Reihenfolge wichtig ist.
Dadurch konnte ich auf die Sitzung in meiner API zugreifen. Ich habe auch VerifyCsrfToken hinzugefügt, da bei Cookies / Sitzungen für CSRF gesorgt werden muss.
quelle
Können Sie
->stateless()
vor dem verwenden->redirect()
. Dann brauchen Sie die Sitzung nicht mehr.quelle
in meinem Fall war es nur um die Rückkehr zu setzen; am Ende der Funktion, wo ich Sitzung eingestellt habe
quelle
Wenn Sie CSRF verwenden, geben Sie ein
'before'=>'csrf'
In deinem Fall
Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Weitere Informationen finden Sie in Laravel 5 Documentation Security Protecting Routes
quelle
Es steht nicht in der Laravel-Dokumentation, ich habe eine Stunde gebraucht, um dies zu erreichen:
Meine Sitzung dauerte nicht an, bis ich die "Speichern" -Methode verwendete ...
quelle
Die Web-Middleware-Gruppe Laravel 5.3+ wird vom RouteServiceProvider automatisch auf Ihre Datei route / web.php angewendet.
Sofern Sie das Kernel $ middlewareGroups-Array nicht in einer nicht unterstützten Reihenfolge ändern, versuchen Sie wahrscheinlich, Anforderungen als reguläre Abhängigkeit vom Konstruktor einzufügen.
Anfrage verwenden als
anstatt
quelle
Ich habe diesen Fehler mit Laravel Sanctum bekommen. Ich habe es behoben, indem ich es
\Illuminate\Session\Middleware\StartSession::class,
zurapi
Middleware-Gruppe in Kernel.php hinzugefügt habe, aber ich habe später herausgefunden, dass dies "funktioniert" hat, weil meine Authentifizierungsroutenapi.php
anstelle von hinzugefügt wurdenweb.php
, sodass Laravel den falschen Authentifizierungsschutz verwendete .Ich habe diese Routen hierher verschoben
web.php
und dann haben sie angefangen, richtig mit demAuthenticatesUsers.php
Merkmal zu arbeiten:Ich habe das Problem herausgefunden, nachdem ich einen weiteren seltsamen Fehler erhalten habe, über den
RequestGuard::logout()
es keinen gibt.Mir wurde klar, dass meine benutzerdefinierten Authentifizierungsrouten Methoden aus dem Merkmal AuthenticatesUsers aufrufen, aber ich habe sie nicht verwendet
Auth::routes()
, um dies zu erreichen. Dann wurde mir klar, dass Laravel standardmäßig den Web Guard verwendet und das bedeutet, dass Routen vorhanden sein solltenroutes/web.php
.So sehen meine Einstellungen jetzt mit Sanctum und einer entkoppelten Vue SPA-App aus:
Kernel.php
config / auth.php
Dann können Sie Unit-Tests wie diesen durchführen lassen, wo dies kritisch ist
Auth::check()
,Auth::user()
undAuth::logout()
wie erwartet mit minimaler Konfiguration und maximaler Verwendung vonAuthenticatesUsers
undRegistersUsers
Merkmalen arbeiten.Hier sind einige meiner Login-Unit-Tests:
TestCase.php
LoginTest.php
Ich habe die Methoden
registered
undauthenticated
in den Laravel-Authentifizierungsmerkmalen überschrieben , sodass sie das Benutzerobjekt anstelle nur der 204 OPTIONEN zurückgeben:Sehen Sie sich den Herstellercode für die Authentifizierungsmerkmale an. Sie können sie unberührt verwenden, plus diese beiden oben genannten Methoden.
Hier sind die Vuex-Aktionen meines Vue SPA für die Anmeldung:
Ich habe über eine Woche gebraucht, um Laravel Sanctum + Vue SPA + Auth-Unit-Tests mit derselben Domäne zu erhalten, die alle meinem Standard entsprechen. Hoffentlich kann meine Antwort hier dazu beitragen, anderen in Zukunft Zeit zu sparen.
quelle