Laravel中间件无法识别用户登录



我正在使用Laravel 8,我想应用一个中间件来检查用户是否将is_staffis_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' => AppHttpMiddlewareAdminAuthenticated::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');
});

那么这里出了什么问题?如何解决这个问题?

我认为您还需要将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' => [
AppHttpMiddlewareEncryptCookies::class,            
IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
IlluminateSessionMiddlewareStartSession::class,
IlluminateViewMiddlewareShareErrorsFromSession::class,
AppHttpMiddlewareVerifyCsrfToken::class,
IlluminateRoutingMiddlewareSubstituteBindings::class,
],

没有web中间件会话将不可用

你没有显示整个路由,但我打赌你的使用从来没有被记录。

你可能应用:

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

为所有管理路由。你有一个登录表单,当你填写登录数据时,用户会到达一些端点,这些端点也应用了这个中间件,所以它永远不会到控制器,你登录用户的控制器因为中间件重定向回/。

你应该把中间件应用到除了login/remind password之外的所有路由上,否则无法登录。

最新更新