Laravel清理Session导致已认证用户登出问题排查
先贴出你的代码片段:
if ($myResponse->response->accepted == 1) { session()->forget('card'); if(!Auth::check()){ session()->forget('shippingAddress'); } return redirect()->route('myOrders')->with('success','success'); }
下面是具体排查方向:
检查Session驱动与权限
确认.env中SESSION_DRIVER配置(比如file或database),如果是file驱动,务必保证storage/framework/sessions目录有读写权限,权限不足会导致Session文件无法正常更新,间接让Auth会话失效。同时查看config/session.php里的lifetime和expire_on_close参数,确保会话有效期设置合理。排查Session键冲突
Laravel默认Auth会话用的是login_web_*这类前缀的键,但如果自定义过Auth配置,可能和你存的card键存在冲突。可以在session()->forget('card')前加dd(session()->all()),打印所有Session数据,确认card键是否和Auth相关键重叠。验证Auth状态的执行时机
你代码里Auth::check()是在清理card之后执行的,不排除清理card时意外影响了Auth会话。可以把Auth::check()移到session()->forget('card')之前,或者在清理前后分别打印Auth::id(),看用户身份是否在清理card后丢失。测试Flash Session的影响
redirect()->with()会写入一次性Flash Session数据,虽然本身不会影响Auth,但如果Session驱动有问题,写入Flash数据时可能损坏原有Session。可以暂时去掉with('success','success'),测试跳转后用户是否还会被登出。查看Laravel日志
打开storage/logs/laravel.log,查找Session相关的错误(比如Session写入失败、权限报错等),这类错误会导致Auth会话无法持久化,进而引发登出问题。
内容的提问来源于stack exchange,提问作者322quick1

