我正在使用Laravel 8,我想應用一個中間件來檢查使用者是否將is_staff
或is_superuser
設定為1,然後他可以存取管理儀表板,否則他無法訪問它。
為了做到這一點,我創建了這個:
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('/'); } }
現在的問題是它返回 redirect('/');
意味著中間件無法識別用戶已經登錄,但他已經登入了。
我已經這樣註冊了中間件:
protected $routeMiddleware = [ ... 'auth.admin' => \App\Http\Middleware\AdminAuthenticated::class,
並將其套用到我的管理路由(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')); }); }
這是 admin.php
路由:
Route::get('/',function (){ return view('admin.master'); });
那麼這裡出了什麼問題呢?我該如何解決這個問題?
P粉3546029552024-03-26 21:14:39
您沒有顯示整個路由,但我敢打賭您的使用永遠不會被記錄。
您可能會申請:
Route::middleware('auth.admin') ->namespace($this->namespace) ->prefix('admin') ->group(base_path('routes/web/admin.php'));
對於所有管理路由。因此,您有登入表單,當您填寫登入資料時,使用者會點擊某個也應用此中間件的端點,因此它永遠不會到達您實際登入使用者的控制器,因為中間件重新導向回 /。
除了登入/提醒密碼之外的所有路由都應該套用中間件,否則無法登入。
P粉7970046442024-03-26 20:56:59
我認為您還需要將 web
中間件新增到管理路由。
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()
嘗試從會話中取得目前登入的使用者。
web
中間件群組啟動會話,它應用了一堆中間件
//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, ],
沒有 web
中間件會話將不可用