Laravel 9调用auth()->attempt()登录验证始终返回false
问题根因
Laravel 9 全新安装的项目中,App\Models\User模型默认对password字段开启了自动哈希的类型转换,你创建用户时手动调用bcrypt('password')加密,会导致密码被二次哈希后存入数据库,最终认证匹配失败。
打开app/Models/User.php文件可以看到默认配置:
protected $casts = [ 'email_verified_at' => 'datetime', 'password' => 'hashed', ];
这个配置的作用是:模型每次写入password字段时,会自动对传入的值做bcrypt哈希处理。你创建用户时传入的已经是一次bcrypt生成的哈希字符串,模型会对这个哈希字符串再做一次bcrypt运算后存入数据库,最终数据库存储的是bcrypt(bcrypt('password'))的结果,认证时拿明文password去匹配自然会返回false。
修复方案
两种方案选择任意一种即可:
- 方案1(官方推荐):创建用户时不要手动调用加密函数,直接传入明文密码,交给模型自动完成哈希:
Route::get('test',function (){ $user = \App\Models\User::create([ 'name' => fake()->name(), 'email' => 'a@d.com', 'email_verified_at' => now(), 'password' => 'password', ]); dd($user); });
修改后先删除之前创建的测试用户,重新访问/test生成新用户,再访问/test2即可认证成功。
- 方案2:如果你需要手动控制密码加密逻辑,可以直接删除User模型
$casts数组中'password' => 'hashed'这行配置,关闭自动哈希,保留你原有手动bcrypt的写法即可。
提示:优先选择方案1,模型自动哈希可以避免项目中多处手动加密逻辑不一致导致的密码验证问题。
内容的提问来源于stack exchange,提问作者Recep Gümüş
相关产品推荐
相关产品推荐

