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
相关产品推荐
相关产品推荐

