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

Laravel-MongoDB自定义customer集合认证始终返回false问题排查

解决Laravel + Jenssegers MongoDB自定义集合认证失败问题

以下是针对Auth::attempt()返回The provided credentials do not match our records.的排查和修复步骤:

1. 确认密码哈希是否正确

Laravel认证系统依赖Hash facade生成的密码哈希值,直接存储明文或其他哈希格式的密码会导致验证失败。

  • 检查customer集合中password字段的值:必须是通过Hash::make('your-password')生成的字符串(长度约60位,以$2y$开头)。
  • 创建用户时确保代码正确:
    // 示例:创建Customer用户
    Customer::create([
        'email' => $request->email,
        'password' => Hash::make($request->password), // 必须用Hash::make生成哈希
        // 其他字段...
    ]);
    

2. 核对认证配置与模型关联

  • config/auth.php:确保providers数组中自定义的provider指向正确模型,同时guards关联该provider:
    'providers' => [
        // ...
        'customers' => [
            'driver' => 'mongodb',
            'model' => App\Models\Customer::class,
        ],
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'customers', // 这里要改为自定义的provider名称
        ],
    ],
    
  • 如果使用非email字段作为登录标识(如phone),需在provider中指定username字段:
    'customers' => [
        'driver' => 'mongodb',
        'model' => App\Models\Customer::class,
        'username' => 'phone', // 替换为你的实际登录字段
    ],
    
    或在Customer模型中重写方法:
    public function getAuthIdentifierName()
    {
        return 'phone';
    }
    

3. 检查Customer模型的继承与配置

  • 模型必须继承Jenssegers的MongoDB认证用户类,而非默认Laravel用户类:
    use Jenssegers\Mongodb\Auth\User as Authenticatable;
    
    class Customer extends Authenticatable
    {
        protected $collection = 'customer'; // 指定自定义集合名
        protected $fillable = [
            'email', // 或你的登录字段
            'password',
            // 其他可填充字段
        ];
    }
    
    注意:不要继承Illuminate\Foundation\Auth\User,否则无法适配MongoDB认证逻辑。

4. 验证数据库连接与集合存在性

  • config/database.php:确认mongodb连接配置正确:
    'connections' => [
        'mongodb' => [
            'driver' => 'mongodb',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', 27017),
            'database' => env('DB_DATABASE', 'your-db-name'),
            'username' => env('DB_USERNAME'),
            'password' => env('DB_PASSWORD'),
            'options' => [
                'database' => 'admin', // 可选,认证数据库
            ]
        ],
    ],
    
  • .env:确保DB_CONNECTION=mongodb,且数据库名称、地址与实际MongoDB实例一致。
  • 直接通过MongoDB客户端检查:确认customer集合存在,目标用户文档的登录字段(如email)值无拼写或大小写错误(MongoDB默认区分大小写)。

5. 调试Auth::attempt的传入参数

在LoginController的登录方法中,打印传入Auth::attempt的参数,确认字段名和值是否正确:

public function login(Request $request)
{
    $credentials = $request->only('email', 'password');
    dd($credentials); // 检查字段名是否正确,值是否与数据库匹配
    if (Auth::attempt($credentials)) {
        // 登录逻辑
    } else {
        // 失败提示
    }
}

常见错误:字段名拼写错误(如e-mail而非email)、密码输入错误、登录字段大小写不匹配。

6. 检查用户状态限制(如果有)

如果customer集合中有状态字段(如is_active),Auth::attempt默认不会验证该字段,需手动添加条件:

// 示例:仅允许激活状态的用户登录
if (Auth::attempt(array_merge($credentials, ['is_active' => 1]))) {
    // 登录逻辑
}

内容的提问来源于stack exchange,提问作者Januar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:34:56