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

Laravel 8中Auth::user()与$request->user()返回错误用户问题求助

Laravel Sanctum认证异常:部分用户跨API请求返回错误用户数据

问题描述

存在user1、user2、user3三个用户:

  • user1、user2登录后,调用部分API时$request->user()/Auth::user()返回固定用户X的数据,但部分接口能返回正确用户
  • user3登录后,所有接口均能返回正确用户数据

已尝试改用Auth::user(),问题未解决。相关代码如下:

登录方法

public function login(LoginRequest $req)
{
    $credentials = [
        'username' => $req->has('email') ? $req->email : $req->username,
        'password' => $req->password
    ];
    try {
        if (!Auth::attempt($credentials)) {
            return $this->sendError('The provided credentials do not match our records.', 400);
        }
        $user = $req->user();
        return $this->sendSuccess('Login successfully.', $this->authResponse($user));
    } catch (\Exception $e) {
        return $this->sendError($e->getMessage());
    }
}

LoginRequest验证规则

public function rules()
{
    return [
        'email' => 'required|email',
        'password' => 'required'
    ];
}

获取用户的路由

Route::middleware(['auth:sanctum'])->group(function(){
Route::get('user', function (Request $request) {
        return $request->user();
    });
});

排查与解决方向

1. 检查authResponse方法的令牌生成逻辑

这是最可能的问题点:确保authResponse方法是通过当前登录用户生成令牌,而非硬编码或复用其他用户的令牌。正确的令牌生成代码示例:

private function authResponse($user)
{
    $token = $user->createToken('api-token')->plainTextToken;
    return [
        'user' => $user,
        'token' => $token
    ];
}

如果该方法中存在错误关联用户ID、复用旧令牌的逻辑,会直接导致后续请求用错误的令牌获取用户数据。

2. 核查personal_access_tokens表的令牌关联

直接查询数据库的personal_access_tokens表,检查user1、user2的令牌对应的user_id是否正确:

  • 若发现user1的令牌user_id指向用户X,说明令牌生成时关联错误,需要修复令牌生成逻辑
  • 同时清理该表中无效/错误的令牌,避免残留数据干扰

3. 确认异常API的中间件配置

检查返回错误用户的API路由,确保它们都正确应用了auth:sanctum中间件:

  • 若部分路由未加入auth:sanctum中间件组,且代码中存在手动获取用户的逻辑(比如从会话/缓存中取),可能导致用户混淆
  • 确保中间件顺序正确,没有全局中间件覆盖了Sanctum的认证逻辑

4. 清除Laravel缓存

缓存异常可能导致认证配置或用户数据错乱,执行以下命令清除所有缓存:

php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear

5. 检查用户模型与Sanctum配置

  • 确认User模型正确引入了Laravel\Sanctum\HasApiTokens trait,没有重写getAuthIdentifier()、getAuthPassword()等核心认证方法
  • 检查config/sanctum.php中的stateful_domains配置,确保前端域名在列表中,避免跨域会话异常
  • 临时将.env中的SESSION_DRIVER改为array(测试环境),排查是否是会话驱动(如file/database)的存储异常导致用户数据混淆

6. 排查用户数据异常

检查user1、user2、用户X的数据库记录:

  • 是否存在ID重复、字段值异常(如email/username重复)的情况?
  • 若用户模型有自定义的认证逻辑(如findForPassport),确认该逻辑没有错误匹配用户

内容的提问来源于stack exchange,提问作者Muchamad Fahrur Rizky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:05:28