Saya baru-baru ini membuat proyek Laravel baru dan mengikuti panduan tentang Otentikasi. Saat saya mengunjungi rute login atau register, saya mendapatkan error berikut:
ErrorException in Request.php line 775:
Session store not set on request. (View: C:\Users\Matthew\Documents\test\resources\views\auth\register.blade.php)
Saya belum mengedit file inti Laravel, saya hanya membuat tampilan dan menambahkan rute ke file routes.php saya
// 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']);
Saya tidak memiliki banyak pengalaman dengan Laravel, jadi mohon maaf atas ketidaktahuan saya. Saya sadar bahwa ada pertanyaan lain yang menanyakan hal yang sama, tetapi tidak satu pun dari jawaban tersebut yang tampaknya berhasil untuk saya. Terima kasih sudah membaca!
Edit:
Ini register.blade.php saya seperti yang diminta.
@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', ]);
Jawaban:
Anda harus menggunakan middleware web jika Anda memerlukan status sesi, perlindungan CSRF, dan banyak lagi.
sumber
php artisan key:generate
Jika menambahkan
routes
bagian dalamweb middleware
Anda tidak berfungsi karena alasan apa pun, coba tambahkan ini ke$middleware
dalamKernel.php
sumber
Dalam kasus saya (menggunakan Laravel 5.3) menambahkan hanya 2 middleware berikut memungkinkan saya mengakses data sesi di rute API saya:
\App\Http\Middleware\EncryptCookies::class
\Illuminate\Session\Middleware\StartSession::class
Deklarasi keseluruhan (
$middlewareGroups
di Kernel.php):sumber
Jika jawaban Cas Bloem tidak berlaku (yaitu, Anda pasti mendapatkan
web
middleware pada rute yang berlaku), Anda mungkin ingin memeriksa urutan middlewares di Kernel HTTP Anda.Urutan defaultnya
Kernel.php
adalah ini:Perhatikan yang
VerifyCsrfToken
muncul setelahnyaStartSession
. Jika Anda mendapatkan ini dalam urutan yang berbeda, ketergantungan di antara keduanya juga dapat mengarah padaSession store not set on request.
pengecualian.sumber
Masalahnya bisa jadi Anda mencoba mengakses sesi Anda di dalam
__constructor()
fungsi pengontrol Anda .Dari Laravel 5.3+ ini tidak mungkin lagi karena itu tidak dimaksudkan untuk berfungsi, seperti yang dinyatakan dalam panduan peningkatan .
Untuk informasi latar belakang lebih lanjut, baca juga tanggapan Taylor .
Solusi
Jika Anda masih ingin menggunakan ini, Anda dapat membuat middleware secara dinamis dan menjalankannya di konstruktor, seperti yang dijelaskan dalam panduan peningkatan:
sumber
Laravel [5.4]
Solusi saya adalah menggunakan pembantu sesi global: sesi ()
Fungsinya sedikit lebih sulit daripada $ request-> session () .
menulis :
mendorong :
mengambil :
sumber
Dalam kasus saya, saya menambahkan 4 baris berikut ke $ middlewareGroups (di app / Http / Kernel.php):
PENTING: 4 baris baru harus ditambahkan SEBELUM 'throttle' dan 'bindings'!
Jika tidak, kesalahan "Token CSRF tidak cocok" akan muncul. Saya telah berjuang dalam hal ini selama beberapa jam hanya untuk menemukan urutan itu penting.
Ini memungkinkan saya untuk mengakses sesi di API saya. Saya juga menambahkan VerifyCsrfToken karena ketika cookie / sesi terlibat, CSRF perlu dijaga.
sumber
Apakah Anda dapat menggunakan
->stateless()
sebelum->redirect()
. Maka Anda tidak perlu sesi lagi.sumber
dalam kasus saya itu hanya untuk mengembalikan; di akhir fungsi di mana saya telah mengatur sesi
sumber
Jika Anda menggunakan CSRF, masukkan
'before'=>'csrf'
Dalam kasus Anda
Route::get('auth/login', ['before'=>'csrf','uses' => 'Auth\AuthController@getLogin', 'as' => 'login']);
Untuk lebih jelasnya lihat Laravel 5 Documentation Security Protecting Routes
sumber
Tidak ada dalam dokumentasi laravel, saya sudah satu jam untuk mencapai ini:
Sesi saya tidak bertahan sampai saya menggunakan metode "simpan" ...
sumber
Grup middleware web Laravel 5.3+ secara otomatis diterapkan ke file routes / web.php Anda oleh RouteServiceProvider.
Kecuali Anda memodifikasi larik kernel $ middlewareGroups dalam urutan yang tidak didukung, mungkin Anda mencoba memasukkan permintaan sebagai ketergantungan reguler dari konstruktor.
Gunakan permintaan sebagai
dari pada
sumber
Saya mendapatkan kesalahan ini dengan Laravel Sanctum. Saya memperbaikinya dengan menambahkan
\Illuminate\Session\Middleware\StartSession::class,
keapi
grup middleware di Kernel.php, tetapi saya kemudian menemukan bahwa ini "berfungsi" karena rute otentikasi saya ditambahkanapi.php
sebagai gantiweb.php
, jadi Laravel menggunakan penjaga auth yang salah.Saya memindahkan rute ini ke sini
web.php
dan kemudian mereka mulai bekerja dengan benar denganAuthenticatesUsers.php
sifat:Saya menemukan masalah setelah saya mendapat kesalahan aneh lainnya tentang
RequestGuard::logout()
tidak ada.Itu membuat saya menyadari bahwa rute autentikasi khusus saya memanggil metode dari sifat AuthenticatesUsers, tetapi saya tidak menggunakannya
Auth::routes()
untuk mencapainya. Kemudian saya menyadari Laravel menggunakan penjaga web secara default dan itu berarti rute harus masukroutes/web.php
.Seperti inilah pengaturan saya sekarang dengan Sanctum dan aplikasi Vue SPA yang terpisah:
Kernel.php
config / auth.php
Maka Anda dapat memiliki unit test seperti ini, di mana kritis,
Auth::check()
,Auth::user()
, danAuth::logout()
bekerja seperti yang diharapkan dengan konfigurasi minimal dan penggunaan maksimalAuthenticatesUsers
danRegistersUsers
sifat.Berikut adalah beberapa pengujian unit login saya:
TestCase.php
LoginTest.php
Saya mengganti
registered
danauthenticated
metode dalam sifat autentikasi Laravel sehingga mereka mengembalikan objek pengguna, bukan hanya 204 OPTIONS:Lihat kode vendor untuk mengetahui ciri-ciri autentikasi. Anda dapat menggunakannya tanpa tersentuh, ditambah dua metode di atas.
Berikut adalah tindakan Vuex Vue SPA saya untuk login:
Saya membutuhkan waktu lebih dari seminggu untuk mendapatkan tes unit autentikasi Laravel Sanctum + Vue SPA + domain yang sama semuanya bekerja sesuai standar saya, jadi semoga jawaban saya di sini dapat membantu menghemat waktu orang lain di masa mendatang.
sumber