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

