Niedawno stworzyłem nowy projekt Laravel i postępowałem zgodnie z przewodnikiem dotyczącym uwierzytelniania. Kiedy odwiedzam moją trasę logowania lub rejestracji, pojawia się następujący błąd:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
Nie edytowałem żadnych podstawowych plików Laravel, stworzyłem tylko widoki i dodałem trasy do mojego pliku tours.php
// 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']);
Nie mam dużego doświadczenia z Laravelem, więc wybacz mi moją ignorancję. Zdaję sobie sprawę, że jest jeszcze jedno pytanie, które zadaje to samo, ale żadna z odpowiedzi nie wydaje mi się skuteczna. Dziękuje za przeczytanie!
Edytować:
Oto mój register.blade.php zgodnie z żądaniem.
@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', ]);
Odpowiedzi:
Jeśli potrzebujesz stanu sesji, ochrony CSRF i nie tylko, musisz użyć internetowego oprogramowania pośredniczącego .
źródło
php artisan key:generate
W przypadku dodawania
routes
wewnątrzweb middleware
nie działa dla jakiegokolwiek powodu następnie spróbuj dodać to$middleware
doKernel.php
źródło
W moim przypadku (używając Laravel 5.3) dodanie tylko następującego 2 oprogramowania pośredniego umożliwiło mi dostęp do danych sesji w moich trasach API:
\App\Http\Middleware\EncryptCookies::class
\Illuminate\Session\Middleware\StartSession::class
Cała deklaracja (
$middlewareGroups
w Kernel.php):źródło
Jeśli odpowiedź Cas Bloem nie ma zastosowania (tj. Na pewno masz
web
oprogramowanie pośrednie na odpowiedniej trasie), możesz chcieć sprawdzić kolejność oprogramowania pośredniego w jądrze HTTP.Domyślna kolejność
Kernel.php
jest następująca:Zauważ, że
VerifyCsrfToken
nastąpi późniejStartSession
. Jeśli masz je w innej kolejności, zależność między nimi może również prowadzić doSession store not set on request.
wyjątku.źródło
Problem może polegać na tym, że próbujesz uzyskać dostęp do sesji w ramach
__constructor()
funkcji kontrolera .Od wersji Laravel 5.3+ nie jest to już możliwe, ponieważ i tak nie jest przeznaczone do pracy, jak stwierdzono w przewodniku aktualizacji .
Aby uzyskać więcej informacji ogólnych, przeczytaj również jego odpowiedź Taylora .
Obejście problemu
Jeśli nadal chcesz z tego korzystać, możesz dynamicznie utworzyć oprogramowanie pośredniczące i uruchomić je w konstruktorze, zgodnie z opisem w przewodniku aktualizacji:
źródło
Laravel [5,4]
Moim rozwiązaniem było użycie globalnego pomocnika sesji : session ()
Jego funkcjonalność jest nieco trudniejsza niż $ request-> session () .
pisanie :
pchanie :
pobieranie :
źródło
W moim przypadku dodałem następujące 4 wiersze do $ middlewareGroups (w app / Http / Kernel.php):
WAŻNE: 4 nowe linki należy dodać PRZED „przepustnicą” i „wiązaniami”!
W przeciwnym razie wystąpi błąd „niezgodność tokena CSRF”. Walczyłem w tym przez kilka godzin, aby znaleźć porządek jest ważny.
To pozwoliło mi na dostęp do sesji w moim API. Dodałem również VerifyCsrfToken, ponieważ w przypadku plików cookie / sesji należy zająć się CSRF.
źródło
Czy możesz użyć
->stateless()
przed->redirect()
. Wtedy sesja nie jest już potrzebna.źródło
w moim przypadku był to po prostu powrót; na końcu funkcji, w której ustawiłem sesję
źródło
Jeśli używasz CSRF, wpisz
'before'=>'csrf'
W Twoim przypadku
Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Aby uzyskać więcej informacji, zobacz Laravel 5 Documentation Security Protecting Routes
źródło
Nie ma tego w dokumentacji laravela, miałem godzinę, aby to osiągnąć:
Moja sesja nie została utrzymana, dopóki nie użyłem metody „zapisz” ...
źródło
Grupa oprogramowania pośredniego Laravel 5.3+ jest automatycznie stosowana do pliku routingu / web.php przez dostawcę RouteServiceProvider.
Jeśli nie zmodyfikujesz tablicy jądra $ middlewareGroups w nieobsługiwanej kolejności, prawdopodobnie próbujesz wstrzyknąć żądania jako zwykłą zależność od konstruktora.
Użyj żądania jako
zamiast
źródło
Otrzymałem ten błąd w Laravel Sanctum. Naprawiłem to, dodając
\Illuminate\Session\Middleware\StartSession::class,
doapi
grupy oprogramowania pośredniego w Kernel.php, ale później odkryłem, że to „zadziałało”, ponieważ moje trasy uwierzytelniania zostały dodaneapi.php
zamiastweb.php
, więc Laravel używał niewłaściwego zabezpieczenia uwierzytelniania.Przeniosłem te trasy tutaj do,
web.php
a potem zaczęły działać poprawnie zAuthenticatesUsers.php
cechą:Znalazłem problem po tym, jak otrzymałem kolejny dziwny błąd dotyczący
RequestGuard::logout()
nie istnieje.Uświadomiłem sobie, że moje niestandardowe trasy uwierzytelniania wywołują metody z cechy AuthenticatesUsers, ale nie
Auth::routes()
używałem go do tego. Potem zdałem sobie sprawę, że Laravel domyślnie używa ochrony sieci, a to oznacza, że trasy powinny być włączoneroutes/web.php
.Tak wyglądają teraz moje ustawienia z Sanctum i odsprzężoną aplikacją Vue SPA:
Kernel.php
config / auth.php
Wtedy można mieć testów jednostkowych, takich jak ten, w którym krytycznie
Auth::check()
,Auth::user()
iAuth::logout()
działa zgodnie z oczekiwaniami przy minimalnej konfiguracji i maksymalnego wykorzystaniaAuthenticatesUsers
iRegistersUsers
cech.Oto kilka moich testów jednostkowych logowania:
TestCase.php
LoginTest.php
I overrided
registered
iauthenticated
metod w cechach auth laravel tak aby przywrócić obiekt użytkownika, a nie tylko 204 opcji:Spójrz na kod dostawcy dla cech autoryzacji. Możesz z nich korzystać bez zmian, a także z tych dwóch powyższych metod.
Oto moje działania Vuex do logowania w Vue SPA:
Zajęło mi ponad tydzień, zanim testy jednostkowe Laravel Sanctum + tej samej domeny Vue SPA + auth działały zgodnie z moim standardem, więc mam nadzieję, że moja odpowiedź pomoże zaoszczędzić innym czas w przyszłości.
źródło