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

Laravel 登录成功后自定义中间件 Auth::check 返回 false 如何排查?

问题排查步骤
  • 检查中间件的注册顺序和分组
    Laravel 身份验证能力依赖 Session 机制,你的自定义权限中间件必须在 StartSession 中间件之后执行。打开 app/Http/Kernel.php 确认配置:
    • 如果你将 AuthorizeUser 注册到全局 $middleware 数组,确认它的排序在 \Illuminate\Session\Middleware\StartSession::class 之后
    • 更推荐将自定义权限中间件放到 web 中间件组中,放在 \App\Http\Middleware\EncryptCookies::class 和 \Illuminate\Session\Middleware\StartSession::class 之后,web 组默认已加载 Cookie、Session 等身份验证依赖的基础中间件。
  • 检查用户模型主键配置
    如果你修改了 User 模型的默认主键(比如将默认的 id 改为 user_id,或者主键类型不是自增整数),需要在 User 模型中显式配置对应的 $primaryKey、$keyType,如果主键非自增还需要添加 public $incrementing = false;,否则 Session 存储用户标识时会出错,导致后续 Auth 无法读取到登录用户。
  • 检查 Session 配置
    打开 config/session.php 核对以下配置:
    • driver 配置可用性:如果使用 file 驱动,确认 storage/framework/sessions 目录有读写权限;如果使用 redis/database 驱动,确认对应服务连接正常。
    • domain 和 path 配置要和你实际访问的站点域名匹配,否则 Session Cookie 不会被正确携带,导致无法关联到对应 Session。
    • secure 配置:如果站点未开启 HTTPS 访问,需要将 secure 设为 false,否则 Session Cookie 不会在 HTTP 请求下发送。
  • 检查 Auth Guard 配置
    打开 config/auth.php 确认默认 Guard 是 web,如果你使用了自定义 Guard,需要保证 Auth::attempt 和 Auth::check 调用的是同一个 Guard:如果登录时用了 Auth::guard('admin')->attempt(...),校验时也需要用 Auth::guard('admin')->check(),否则就会出现验证成功但读取不到登录状态的问题。
  • 验证 Session 写入是否正常
    可以加日志调试两次请求的 Session 关联是否正常,在登录控制器验证成功后添加日志:
if (Auth::attempt($credentials)) {
    $request->session()->regenerate();
    // 新增调试日志
    info('登录成功', ['session_id' => $request->session()->getId(), 'user_id' => Auth::id()]);
    return redirect()->intended('/');
}

在自定义中间件中也添加日志:

public function handle(Request $request, Closure $next)
{
    info('中间件校验', ['session_id' => $request->session()->getId(), 'user_id' => Auth::id()]);
    if (Auth::check()) {
        return $next($request);
    } else {
        return view('application');
    }
}

对比两次打印的 session_id 是否一致,如果不一致说明 Session 再生后没有正确保存,或者重定向后没有携带正确的 Session Cookie。

  • 额外排查点:确认没有提前终止程序
    Laravel 的 Session 数据是在响应发送给客户端之后才持久化存储的,如果你在 Auth::attempt 成功后、redirect() 返回前加了 dd()、exit()、die() 这类提前终止程序的代码,Session 数据不会被写入,自然后续请求就读取不到登录状态。

内容的提问来源于stack exchange,提问作者userDuR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:27:03