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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:45:49