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\HasApiTokenstrait,没有重写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
相关产品推荐
相关产品推荐

