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

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}。

2. 检查Passport版本兼容性

Laravel 6.x要求Passport版本≥7.0,若升级后未同步更新Passport,会出现兼容性问题:

  • 操作:
    1. 查看composer.json中laravel/passport的版本;
    2. 执行composer require laravel/passport:^7.0更新;
    3. 重新运行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\User trait并实现对应契约,示例结构:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:14:54