Laravel 9切换至MongoDB后Auth::attempt登录失败求助
Laravel 9 + JWT + MongoDB 登录验证失败(Auth::attempt 返回 false)解决方案
以下是针对问题的具体排查与解决步骤:
1. 密码字段名称不匹配
Laravel 的 Auth::attempt() 方法默认会匹配名为 password 的字段,但你的模型中使用 strPassword 存储哈希密码。需要在 User 模型中指定自定义密码字段:
// 在 User 模型中添加该方法 public function getAuthPassword() { return $this->strPassword; }
2. 认证配置未适配 MongoDB
检查 config/auth.php 文件,确保 guard 和 provider 配置正确适配 MongoDB 驱动:
'guards' => [ 'api' => [ 'driver' => 'jwt', 'provider' => 'users', ], ], 'providers' => [ 'users' => [ 'driver' => 'mongodb', // 必须指定为mongodb驱动,而非默认的eloquent 'model' => App\Models\User::class, ], ],
3. JWT 主题方法适配 MongoDB 主键
MongoDB 默认使用 _id 作为主键,需确保 User 模型实现的 JWTSubject 接口方法正确返回主键值:
// 在 User 模型中补充完整 JWTSubject 的两个方法 public function getJWTIdentifier() { return $this->getKey(); // MongoDB 模型的 getKey() 会自动返回 _id } public function getJWTCustomClaims() { return []; }
4. 临时调试确认问题点
可以在 login 方法中添加调试代码,直接排查用户查询与密码匹配问题:
public function login(Request $request) { $request->validate([ 'strEmail' => 'required|string|email', 'strPassword' => 'required|string', ]); // 调试:确认用户是否存在 $user = User::where('strEmail', $request->strEmail)->first(); if (!$user) { return response()->json(['message' => '用户不存在'], 404); } // 调试:验证密码哈希是否匹配 if (!Hash::check($request->strPassword, $user->strPassword)) { return response()->json(['message' => '密码错误'], 401); } // 正常生成 Token $token = Auth::login($user); return response()->json([ 'status' => 'success', 'user' => $user, 'authorisation' => [ 'token' => $token, 'type' => 'bearer', ] ]); }
内容的提问来源于stack exchange,提问作者nidhi shah
相关产品推荐
相关产品推荐

