Laravel密码验证规则

9 浏览
0 Comments

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);
    }

0
0 Comments

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"。

0
0 Comments

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.',
]

这种解决方法将复杂的密码规则拆分成易于理解和维护的格式,同时可以在同一项目中适应不同的密码策略。这是一种相对较好的实践方法,尤其适用于不熟悉正则表达式的开发人员。

0
0 Comments

自从 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个字母。在我的情况下,它总是接受用户输入的任何内容,是否有其他替代方法,或者我漏掉了某些验证规则?

0