Laravel中Auth::attempt()登录失败,用户已存入数据库该如何排查
问题根因
你调用Auth::attempt()的使用方式完全错误,核心问题有两个:
Auth::attempt()第一个参数要求传入包含明文密码的用户凭证数组,方法内部会自动对传入的明文密码做哈希运算,和数据库存储的哈希值做比对。你传入的$user->only(['email','password'])里的password是已经通过Hash::make()处理过的哈希值,相当于用哈希值当明文再次做哈希运算,和数据库的值必然匹配失败Auth::attempt()不支持直接传入Eloquent模型实例作为第一个参数,你写的Auth::attempt($user,true)本身就是无效调用
最优修复方案
注册流程完成后已经拿到了有效的用户模型实例,不需要再走登录验证流程,直接调用Auth::login()手动登录即可:
static function register() { if(self::$validate['message']) { $user = User::create([ 'name' => self::$values['name'], 'email' => self::$values['email'], 'password' => Hash::make(self::$values['password']) ]); // 直接登录用户,第二个参数传true开启记住我功能 Auth::login($user, true); // 注意你原来的代码里response拼写错误,这里做了修正 return result::response(true); } else return self::$validate; }
特殊场景下用attempt实现登录的正确写法
如果有特殊需求必须走attempt验证流程,需要传入注册时的明文密码:
// 用注册时输入的明文密码做验证 Auth::attempt([ 'email' => self::$values['email'], 'password' => self::$values['password'] ], true);
内容的提问来源于stack exchange,提问作者Abdalrhman Hussin
相关产品推荐
相关产品推荐

