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

Laravel中使用Auth facade存储自定义非持久化数据的问题求助

问题描述

我从API获取了一组数组数据,希望能在整个项目中使用。我知道可以用Session,但想借助Auth facade的相关功能。我编写了AccountAuthen中间件从API获取数据并存储到自定义User类中,通过auth()->login($user)登录;同时实现了符合AuthenticatableContract的User类。但目前仅在添加该中间件的控制器中能获取到auth()->user()->contract数据,其他未添加中间件的控制器返回null,期望能全局访问该数据。

现有代码

中间件代码

$contractInfo = [
    'contract' => 'SGA123123',
    'name'     => 'John Doe',
];
$user = new \App\Http\User($contractInfo);
auth()->login($user);
return $next($request);

User类代码

use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Auth\Authenticatable;

class User implements AuthenticatableContract
{
    use Authenticatable;

    protected $contract;

    public function __construct($data = [])
    {
        $this->contract = $data ?? null;
    }

    // AuthenticatableContract必填方法
    public function getAuthIdentifierName()
    {
        return 'contract';
    }

    public function getAuthIdentifier()
    {
        return $this->contract;
    }
}
解决建议
  • 全局注册中间件:打开app/Http/Kernel.php,将AccountAuthen中间件添加到$middleware数组中,让所有HTTP请求都经过该中间件,确保每次请求都完成用户登录初始化:
    protected $middleware = [
        // 保留原有全局中间件
        \App\Http\Middleware\AccountAuthen::class,
    ];
    
  • 修正User类构造逻辑:原构造函数将整个$data数组赋值给$contract属性,导致getAuthIdentifier()返回数组而非预期的合同号,影响Session中用户标识的存储与读取。修正为提取数组对应字段:
    public function __construct($data = [])
    {
        $this->contract = $data['contract'] ?? null;
        $this->name = $data['name'] ?? null; // 可选:若需使用name字段
    }
    
  • 确认Auth驱动配置:检查config/auth.php,确保默认guard使用session驱动(默认配置已满足),这样auth()->login($user)会将用户信息存入Session,后续请求可自动从Session恢复用户实例:
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    ],
    
  • 优化请求逻辑(可选):若API数据不会频繁变更,可在中间件中先判断用户是否已登录,避免重复请求API:
    public function handle(Request $request, Closure $next)
    {
        if (!auth()->check()) {
            // 从API获取$contractInfo的逻辑
            $contractInfo = [
                'contract' => 'SGA123123',
                'name'     => 'John Doe',
            ];
            $user = new \App\Http\User($contractInfo);
            auth()->login($user);
        }
        return $next($request);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:03:10