我正在使用 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
中间件会话将不可用