cari

Rumah  >  Soal Jawab  >  teks badan

Perisian tengah Laravel tidak dapat mengenali bahawa pengguna telah log masuk

Saya menggunakan Laravel 8 dan saya ingin menggunakan perisian tengah untuk menyemak sama ada pengguna telah menetapkan is_staffis_superuser kepada 1 kemudian dia boleh mengakses papan pemuka pentadbir jika tidak, dia tidak boleh mengaksesnya.

Untuk melakukan itu saya mencipta ini:

public function handle($request, Closure $next)
    {
        if(Auth::check()) {
            if(auth()->user()->isSuperUser() || $request->user()->isStaffUser()) {
                return $next($request);
            }else{
                return redirect('/home');
            }
        }else{
            return redirect('/');
        }
    }

Sekarang masalahnya ialah ia kembali redirect('/'); yang bermaksud middleware tidak mengenali bahawa pengguna telah log masuk, tetapi dia sudah log masuk.

Saya telah mendaftarkan middleware seperti ini:

protected $routeMiddleware = [
...
'auth.admin' => \App\Http\Middleware\AdminAuthenticated::class,

dan menggunakannya pada laluan pentadbir saya (RouteServiceProvider.php):

public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            ...

            Route::middleware('auth.admin')
                ->namespace($this->namespace)
                ->prefix('admin')
                ->group(base_path('routes/web/admin.php'));
        });
    }

Ini ialah admin.php laluan:

Route::get('/',function (){
    return view('admin.master');
});

Jadi apa masalahnya di sini? Bagaimanakah saya boleh menyelesaikan masalah ini?

P粉935883292P粉935883292331 hari yang lalu454

membalas semua(2)saya akan balas

  • P粉354602955

    P粉3546029552024-03-26 21:14:39

    Anda tidak menunjukkan keseluruhan laluan, tetapi saya yakin penggunaan anda tidak akan pernah direkodkan.

    Anda boleh memohon:

    Route::middleware('auth.admin')
                    ->namespace($this->namespace)
                    ->prefix('admin')
                    ->group(base_path('routes/web/admin.php'));

    Untuk semua laluan pengurusan. Oleh itu, anda mempunyai borang log masuk dan apabila anda mengisi data log masuk pengguna mencapai beberapa titik akhir yang juga mempunyai middleware ini digunakan supaya ia tidak pernah mencapai pengawal anda di mana pengguna sebenarnya log masuk kerana middleware mengubah hala kembali ke /.

    Semua laluan kecuali kata laluan log masuk/peringatan hendaklah menggunakan perisian tengah, jika tidak, log masuk tidak akan dapat dilakukan.

    balas
    0
  • P粉797004644

    P粉7970046442024-03-26 20:56:59

    Saya rasa anda juga perlu menambah web middleware pada laluan pentadbir.

    public function boot()
    {
        $this->configureRateLimiting();
    
        $this->routes(function () {
                ...
            Route::middleware(['web', 'auth.admin'])
                ->namespace($this->namespace)
                ->prefix('admin')
                ->group(base_path('routes/web/admin.php'));
        });
    }
    

    Auth::check() Cuba dapatkan pengguna yang sedang log masuk daripada sesi.

    web Kumpulan middleware mengaktifkan sesi, yang menggunakan sekumpulan middleware

    //app/Http/Kernel.php
     'web' => [
         \App\Http\Middleware\EncryptCookies::class,            
         \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
         \Illuminate\Session\Middleware\StartSession::class,
         \Illuminate\View\Middleware\ShareErrorsFromSession::class,
         \App\Http\Middleware\VerifyCsrfToken::class,
         \Illuminate\Routing\Middleware\SubstituteBindings::class,
     ],
    

    Tanpa web sesi middleware tidak akan tersedia

    balas
    0
  • Batalbalas