Laravel加入password验证规则后密码校验失效是什么原因?
问题原因分析
1. password验证规则的作用
Laravel 提供的password验证规则不是用来校验密码格式合法性的,它的功能是:将用户提交的明文密码,和当前已认证用户存储在数据库中的哈希密码做比对,只有两者匹配时才会验证通过。
2. 校验失败的原因
这个规则有强制的使用前提:当前请求必须有已经完成登录认证的用户实例。
如果你当前是做登录、注册这类未登录状态的表单校验,系统根本拿不到对应用户的哈希密码用来比对,必然会验证失败。哪怕是已登录场景下的校验(比如修改密码时验证旧密码),如果你用了自定义的用户Guard但没有给规则指定Guard参数,也会出现校验失败的问题。
3. 这个规则是不是多余的?
取决于你的业务场景:
- 如果是注册、登录场景的密码校验:完全多余,直接删掉即可。注册场景只要校验密码长度、格式符合你的要求就行,登录场景的密码正确性校验应该用
Auth::attempt()等认证方法完成,不要在表单验证环节做。 - 如果是修改密码、敏感操作前校验当前用户密码的场景:可以使用,示例用法如下:
// 校验旧密码是否和当前登录用户的密码匹配,web为用户Guard名称,用默认Guard可省略 'old_password' => 'required|min:8|password:web'
调试小技巧
你代码里已经获取了验证错误信息,可以临时打印错误内容快速定位问题:
if ($validator->fails()) { // 打印具体错误信息,就能直接看到规则失败的原因 dd($validator->messages()->first()); Session::flash('error', $validator->messages()->first()); }
内容的提问来源于stack exchange,提问作者Ruben Kubalyan
相关产品推荐
相关产品推荐

