You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AppServiceProvider中获取认证信息?解决用户封禁重定向问题

解决Laravel中登录状态下封禁账号重定向问题

AppServiceProvider的boot方法执行时机过早,此时Laravel的认证流程还未完成,auth()->user()无法获取到有效用户信息,所以这种方式行不通。推荐用自定义路由中间件来实现需求,中间件会在请求经过认证处理后执行,能正常获取当前登录用户的状态。

具体实现步骤:

  1. 创建自定义中间件
    运行Artisan命令生成中间件文件:

    php artisan make:middleware CheckAccountStatus
    
  2. 编写中间件逻辑
    打开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);
    }
    
  3. 注册中间件

    • 若要让所有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 () {
          // 受保护的业务路由
      });
      

补充:登录瞬间检查的方式

如果需要在用户登录时就拦截封禁账号,可在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:15:10