如何在AppServiceProvider中获取认证信息?解决用户封禁重定向问题
解决Laravel中登录状态下封禁账号重定向问题
AppServiceProvider的boot方法执行时机过早,此时Laravel的认证流程还未完成,auth()->user()无法获取到有效用户信息,所以这种方式行不通。推荐用自定义路由中间件来实现需求,中间件会在请求经过认证处理后执行,能正常获取当前登录用户的状态。
具体实现步骤:
创建自定义中间件
运行Artisan命令生成中间件文件:php artisan make:middleware CheckAccountStatus编写中间件逻辑
打开app/Http/Middleware/CheckAccountStatus.php,修改handle方法:public function handle(Request $request, Closure $next) { // 检查用户是否登录且账号被封禁 if (auth()->check() && auth()->user()->is_deleted === true) { // 先登出用户 auth()->logout(); // 重定向到登录页并携带提示信息 return redirect()->route('login')->with('error', '您的账号已被封禁,请联系管理员'); } return $next($request); }注册中间件
- 若要让所有web路由生效,打开
app/Http/Kernel.php,在$middlewareGroups的web组中添加该中间件:protected $middlewareGroups = [ 'web' => [ // ... 其他已存在的中间件 \App\Http\Middleware\CheckAccountStatus::class, ], ]; - 若只想给特定路由组使用,可注册到
$routeMiddleware数组:
然后在路由中调用:protected $routeMiddleware = [ // ... 其他已存在的中间件 'check.account' => \App\Http\Middleware\CheckAccountStatus::class, ];Route::middleware(['auth', 'check.account'])->group(function () { // 受保护的业务路由 });
- 若要让所有web路由生效,打开
补充:登录瞬间检查的方式
如果需要在用户登录时就拦截封禁账号,可在LoginController中重写authenticated方法:
protected function authenticated(Request $request, $user) { if ($user->is_deleted === true) { auth()->logout(); return redirect()->route('login')->with('error', '您的账号已被封禁,请联系管理员'); } return redirect()->intended($this->redirectPath()); }
这种方式仅处理登录瞬间的检查,若用户登录后账号才被封禁,还是需要中间件来实时拦截后续请求。
内容的提问来源于stack exchange,提问作者Niloy Rony
相关产品推荐
相关产品推荐

