Laravel密码验证规则
Laravel密码验证规则
如何在验证器中添加密码验证规则?
验证规则:
密码必须包含以下五个类别中至少三个类别的字符:
- 英文大写字母(A - Z)
- 英文小写字母(a - z)
- 十进制数字(0 - 9)
- 非字母数字字符(例如:!,$,#或%)
- Unicode字符
如何在验证器规则中添加以上规则?
我的代码
// 创建验证规则 ------------------------ $rules = array( 'name' => 'required', // 普通的必填验证 'email' => 'required|email|unique:ducks', // 必填且在ducks表中必须唯一 'password' => 'required', 'password_confirm' => 'required|same:password' // 必填且必须与密码字段匹配 ); // 进行验证 ---------------------------------- // 根据表单输入进行验证 $validator = Validator::make(Input::all(), $rules); // 检查验证是否失败 ----------------------- if ($validator->fails()) { // 从验证器中获取错误消息 $messages = $validator->messages(); // 将错误消息重定向给用户并返回表单页面 return Redirect::to('home') ->withErrors($validator); }
Laravel密码验证规则的出现原因是为了确保密码的安全性。为了满足安全要求,密码必须包含至少三个以下五个类别中的字符:
- 英文大写字符(A-Z)
- 英文小写字符(a-z)
- 十进制数字(0-9)
- 非字母数字字符(例如:!、$、#或%)
- Unicode字符
为了解决这个问题,我们需要创建一个正则表达式并进行验证。正则表达式如下:
^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\d\x])(?=.*[!$#%]).*$
可以在网站[regex101](https://regex101.com/r/lC1vM1/277)上进行测试和验证。然而,你可以根据自己的方式进行测试并进行相应的调整。这只是一个正则表达式的示例,你可以根据自己的需要进行操作。
最终的Laravel验证规则如下:
'password' => [ 'required', 'min:6', 'regex:/^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\d\x])(?=.*[!$#%]).*$/', 'confirmed' ]
需要注意的是:
1. 我已经在正则表达式网站和Laravel 5的测试环境中进行了测试和验证,它是有效的。
2. 我使用了`min:6`,这是可选的,但是设置一个最小密码长度是一个良好的安全实践。
3. 建议使用`confirmed`来确保用户输入的密码是正确的。
4. 在6个字符中,我们的正则表达式应该包含至少3个小写字母或大写字母、数字和特殊字符。
5. 在将代码部署到生产环境之前,一定要在测试环境中测试你的代码。
6. 这个回答中我所做的只是一个正则表达式密码的示例。
关于Laravel中自定义验证规则的消息,可以参考以下链接:
- [Laravel Validation custom message](https://stackoverflow.com/questions/23117999)
- [Custom validation message for regex rule in Laravel?](https://stackoverflow.com/questions/20320148)
- [Laravel custom validation messages](https://stackoverflow.com/questions/23996289)
在正则表达式中,使用`\x`代替`\X`,因为`\X`没有特殊含义。
在Laravel 5.6中,验证规则需要以数组的形式提供:
'password' => [ 'required', 'min:6', 'regex:/^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[\d\X])(?=.*[!$#%]).*$/', 'confirmed', ]
我们能否去掉`min:6`,并将该规则作为正则表达式的一部分指定呢?
另外,你还可以将验证规则添加到服务提供者的`boot`方法中,如下所示:
Validator::extend('strong_password', function ($attribute, $value, $parameters, $validator) { return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*(_|[^\w])).+$/', (string)$value); }, 'Please make a strong password with at least one uppercase and lowercase letter, one number and one special character');
然后可以像这样引用它:
'required|strong_password|string|min:6|confirmed'
在Laravel 5.5中,你应该使用数组。
在这个正则表达式中,空格会通过验证。
在Laravel v7.25.0,PHP 7.4.9中,这个正则表达式无效,会抛出错误"preg_match(): Compilation failed: escape sequence is invalid in character class at offset 46"。
Laravel密码验证规则的问题是,当使用长而复杂的正则表达式来定义密码规则时,代码难以理解和维护。下面是一个解决方法,将密码规则拆分成易于理解和维护的格式。
首先,我们可以使用以下代码定义输入和规则:
$inputs = [ 'email' => 'foo', 'password' => 'bar', ]; $rules = [ 'email' => 'required|email', 'password' => [ 'required', 'string', 'min:10', // 必须至少有10个字符长度 'regex:/[a-z]/', // 必须包含至少一个小写字母 'regex:/[A-Z]/', // 必须包含至少一个大写字母 'regex:/[0-9]/', // 必须包含至少一个数字 'regex:/[@$!%*#?&;]/', // 必须包含一个特殊字符 ], ];
然后,我们可以使用`Validator`类进行验证:
$validation = \Validator::make( $inputs, $rules ); if ( $validation->fails() ) { print_r( $validation->errors()->all() ); }
以上代码将输出以下错误信息:
[ 'The email must be a valid email address.', 'The password must be at least 10 characters.', 'The password format is invalid.', ]
这种解决方法将复杂的密码规则拆分成易于理解和维护的格式,同时可以在同一项目中适应不同的密码策略。这是一种相对较好的实践方法,尤其适用于不熟悉正则表达式的开发人员。
自从 Laravel 8 版本开始,你可以使用内置的密码验证规则。可以通过以下方式进行使用:
// 要求至少8个字符... Password::min(8) // 要求至少一个字母... Password::min(8)->letters() // 要求至少一个大写字母和一个小写字母... Password::min(8)->mixedCase() // 要求至少一个数字... Password::min(8)->numbers() // 要求至少一个符号... Password::min(8)->symbols()
或者你可以将它们链在一起使用:
use Illuminate\Validation\Rules\Password; $rules = [ 'password' => [ 'required', 'string', Password::min(8) ->mixedCase() ->numbers() ->symbols() ->uncompromised(), 'confirmed' ], ]
这就是我使用的方法。对于 8.x 版本来说,这是最相关的答案。Laravel 的文档非常清晰,这是他们网站上展示的示例。谢谢!
这种方法更符合 Laravel 的做法。唯一的问题是你无法在请求中直接修改验证消息,你需要直接在语言文件中进行编辑。
如果只要求使用符号或数字中的一个,而不是两者都要求,这种方法可行吗?
我正在使用 Laravel 10,默认情况下我有与此相同的验证规则,然而在用户尝试注册时,我希望用户设置一个强密码,要求其中包含1个符号、1个数字和1个字母。在我的情况下,它总是接受用户输入的任何内容,是否有其他替代方法,或者我漏掉了某些验证规则?