Ich verwende Laravel 8 und möchte eine Middleware anwenden, um zu überprüfen, ob der Benutzer is_staff
或 is_superuser
auf 1 gesetzt hat. Dann kann er auf das Admin-Dashboard zugreifen, andernfalls kann er nicht darauf zugreifen.
Dazu habe ich Folgendes erstellt:
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('/'); } }
Das Problem ist nun, dass es zurückkommt redirect('/');
was bedeutet, dass die Middleware nicht erkennt, dass der Benutzer angemeldet ist, er aber bereits angemeldet ist.
Ich habe die Middleware so registriert:
protected $routeMiddleware = [ ... 'auth.admin' => \App\Http\Middleware\AdminAuthenticated::class,
und habe es auf meine Admin-Route angewendet (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')); }); }
Das ist die admin.php
Route:
Route::get('/',function (){ return view('admin.master'); });
Was ist hier also das Problem? Wie kann ich dieses Problem lösen?
您没有显示整个路由,但我敢打赌您的使用永远不会被记录。
您可能会申请:
对于所有管理路由。因此,您有登录表单,当您填写登录数据时,用户会点击某个也应用此中间件的端点,因此它永远不会到达您实际登录用户的控制器,因为中间件重定向回 /。
除了登录/提醒密码之外的所有路由都应该应用中间件,否则无法登录。
我认为您还需要将
web
中间件添加到管理路由中。Auth::check()
尝试从会话中获取当前登录的用户。web
中间件组激活会话,它应用了一堆中间件没有
web
中间件会话将不可用