Laravel 5.8升级至6后,有效认证Cookie下Auth Guard校验失败
Laravel 5.8升级至6.x后认证Guard check()失败排查方案
1. 先排查Guard匹配问题(最可能的核心原因)
你登录时用的是默认web guard(Auth::attempt()默认调用web guard,依赖session驱动),但后续请求用的是auth:api中间件——而你的api guard配置的是passport驱动,它的认证逻辑是读取请求头的Bearer Token,而非session cookie,这就导致check()必然返回false。
- 解决方向:
- 如果你的API需要基于session认证:修改
config/auth.php中api guard的driver为session; - 如果要使用Passport认证:登录逻辑要改为生成Passport Token(比如
$user->createToken('Token Name')->accessToken),后续请求在请求头携带Authorization: Bearer {token}。
- 如果你的API需要基于session认证:修改
2. 检查Passport版本兼容性
Laravel 6.x要求Passport版本≥7.0,若升级后未同步更新Passport,会出现兼容性问题:
- 操作:
- 查看
composer.json中laravel/passport的版本; - 执行
composer require laravel/passport:^7.0更新; - 重新运行
php artisan passport:install生成加密密钥。
- 查看
3. 调整Session的SameSite配置
Laravel 6.x开始config/session.php中的same_site默认值从null改为'lax',若你的项目存在跨域、iframe嵌入等场景,可能导致cookie无法被服务器正确识别:
- 操作:
修改config/session.php的same_site值:
然后清除浏览器缓存后重新测试。'same_site' => 'none', // 跨域场景推荐,需配合secure=true(HTTPS环境) // 或根据实际场景改为'lax'/'strict'
4. 验证User模型的Authenticatable契约实现
升级后User模型可能因Laravel契约变更导致无法被Guard正确识别:
- 确认User模型正确继承
Illuminate\Foundation\Auth\Usertrait并实现对应契约,示例结构:namespace App; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use Notifiable; // 模型属性、方法... }
5. 调试SessionGuard的用户获取逻辑
直接定位Guard内部的失败节点:
- 打开
vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php,找到user()方法,添加调试代码:public function user() { if ($this->loggedOut) { return; } // 调试:查看session中存储的用户ID dump($this->session->get($this->getName())); // 调试:查看用户查询结果 dump($this->provider->retrieveById($this->session->get($this->getName()))); // 原方法代码... }- 如果能打印出user_id但查询不到用户:检查User模型的主键、数据库连接是否正确;
- 如果打印不出user_id:说明session读取存在问题,继续排查session存储。
6. 检查Session存储权限与序列化配置
- 若使用file会话驱动:确认
storage/framework/sessions目录权限为755(或775,匹配服务器用户组),确保Laravel有读写权限; - 检查session序列化配置:
config/session.php中的serializer是否为'php'(Laravel 6默认值),若之前修改为json等其他方式,确认序列化/反序列化逻辑正常。
7. 清除缓存并重建配置
升级后可能存在旧配置缓存,执行以下命令清除:
php artisan cache:clear php artisan config:clear php artisan route:clear
同时确认.env文件中的SESSION_DRIVER、SESSION_DOMAIN等配置与升级前一致(或符合当前环境需求)。
内容的提问来源于stack exchange,提问作者Goose
相关产品推荐
相关产品推荐

