Laravel密码验证规则


Laravel password validation rule

如何在验证器中添加密码验证规则?

验证规则:

密码至少包含以下5个类别中的3个字符:

  • 英文大写字符(A - Z)
  • 小写英文字符(a - z)
  • 进制10位(0 - 9)
  • 非字母数字(例如:!、$、#或%)
  • Unicode字符

如何在验证器规则中添加上述规则?

My Code Here

// create the validation rules ------------------------
    $rules = array(
        'name'             => 'required',                        // just a normal required validation
        'email'            => 'required|email|unique:ducks',     // required and must be unique in the ducks table
        'password'         => 'required',
        'password_confirm' => 'required|same:password'           // required and has to match the password field
    );
    // do the validation ----------------------------------
    // validate against the inputs from our form
    $validator = Validator::make(Input::all(), $rules);
    // check if the validator failed -----------------------
    if ($validator->fails()) {
        // get the error messages from the validator
        $messages = $validator->messages();
        // redirect our user back to the form with the errors from the validator
        return Redirect::to('home')
            ->withErrors($validator);
    }

我在Laravel中遇到过类似的情况,并通过以下方式解决了它。

密码至少包含以下5个类别中的3个字符:

  • 英文大写字符(A - Z)
  • 小写英文字符(a - z)
  • 进制10位(0 - 9)
  • 非字母数字(例如:!、$、#或%)
  • Unicode字符

首先,我们需要创建一个正则表达式并验证它。

你的正则表达式看起来像这样:

^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*['d'x])(?=.*[!$#%]).*$

我已经在这个网站上测试和验证了它。然而,以你自己的方式执行你自己的,并相应地调整。这只是一个正则表达式的例子,你可以按你想要的方式操作。

所以你最终的Laravel正则表达式规则应该是这样的:

'password' => [
    'required',
    'min:6',
    'regex:/^.*(?=.{3,})(?=.*[a-zA-Z])(?=.*[0-9])(?=.*['d'x])(?=.*[!$#%]).*$/',
    'confirmed'
]

注意:

  1. 我已经在正则表达式站点和Laravel 5测试环境中测试和验证了它,并且它有效。
  2. 我已经使用了min:6,这是可选的,但是有一个反映不同方面的安全策略总是一个很好的做法,其中之一是最小密码长度。
  3. 我建议您使用密码确认,以确保用户输入正确的密码
  4. 在6个字符内,我们的正则表达式应该包含至少3个a-z或a-z,数字和特殊字符。
  5. 在进入生产环境之前,一定要在测试环境中测试代码。
  6. 我在这个答案中所做的只是一个正则密码
  7. 的例子

关于Laravel中regex规则的自定义验证消息,这里有一些链接可以查看:

  • Laravel Validation自定义消息
  • 自定义验证消息的正则表达式规则在Laravel?
  • Laravel自定义验证消息

这并不完全符合OP的要求,尽管希望它能有所帮助。使用Laravel,你可以用一种易于维护的格式来定义你的规则,如下所示:

    $inputs = [
        'email'    => 'foo',
        'password' => 'bar',
    ];
    $rules = [
        'email'    => 'required|email',
        'password' => [
            'required',
            'string',
            'min:10',             // must be at least 10 characters in length
            'regex:/[a-z]/',      // must contain at least one lowercase letter
            'regex:/[A-Z]/',      // must contain at least one uppercase letter
            'regex:/[0-9]/',      // must contain at least one digit
            'regex:/[@$!%*#?&]/', // must contain a special character
        ],
    ];
    $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开始,你可以使用内置的密码验证:

// Require at least 8 characters...
Password::min(8)
// Require at least one letter...
Password::min(8)->letters()
// Require at least one uppercase and one lowercase letter...
Password::min(8)->mixedCase()
// Require at least one number...
Password::min(8)->numbers()
// Require at least one symbol...
Password::min(8)->symbols()

或者你可以把它们链接起来


use Illuminate'Validation'Rules'Password;
$rules = [
    'password' => [
        'required',
        'string',
        Password::min(8)
            ->mixedCase()
            ->numbers()
            ->symbols()
            ->uncompromised(),
        'confirmed'
    ],
]

自定义Laravel验证规则将允许开发人员为每个用例提供自定义消息,以获得更好的用户体验。

php artisan make:rule IsValidPassword

namespace App'Rules;
use Illuminate'Support'Str;
use Illuminate'Contracts'Validation'Rule;
class isValidPassword implements Rule
{
    /**
     * Determine if the Length Validation Rule passes.
     *
     * @var boolean
     */
    public $lengthPasses = true;
    /**
     * Determine if the Uppercase Validation Rule passes.
     *
     * @var boolean
     */
    public $uppercasePasses = true;
    /**
     * Determine if the Numeric Validation Rule passes.
     *
     * @var boolean
     */
    public $numericPasses = true;
    /**
     * Determine if the Special Character Validation Rule passes.
     *
     * @var boolean
     */
    public $specialCharacterPasses = true;
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $this->lengthPasses = (Str::length($value) >= 10);
        $this->uppercasePasses = (Str::lower($value) !== $value);
        $this->numericPasses = ((bool) preg_match('/[0-9]/', $value));
        $this->specialCharacterPasses = ((bool) preg_match('/[^A-Za-z0-9]/', $value));
        return ($this->lengthPasses && $this->uppercasePasses && $this->numericPasses && $this->specialCharacterPasses);
    }
    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        switch (true) {
            case ! $this->uppercasePasses
                && $this->numericPasses
                && $this->specialCharacterPasses:
                return 'The :attribute must be at least 10 characters and contain at least one uppercase character.';
            case ! $this->numericPasses
                && $this->uppercasePasses
                && $this->specialCharacterPasses:
                return 'The :attribute must be at least 10 characters and contain at least one number.';
            case ! $this->specialCharacterPasses
                && $this->uppercasePasses
                && $this->numericPasses:
                return 'The :attribute must be at least 10 characters and contain at least one special character.';
            case ! $this->uppercasePasses
                && ! $this->numericPasses
                && $this->specialCharacterPasses:
                return 'The :attribute must be at least 10 characters and contain at least one uppercase character and one number.';
            case ! $this->uppercasePasses
                && ! $this->specialCharacterPasses
                && $this->numericPasses:
                return 'The :attribute must be at least 10 characters and contain at least one uppercase character and one special character.';
            case ! $this->uppercasePasses
                && ! $this->numericPasses
                && ! $this->specialCharacterPasses:
                return 'The :attribute must be at least 10 characters and contain at least one uppercase character, one number, and one special character.';
            default:
                return 'The :attribute must be at least 10 characters.';
        }
    }
}

然后在您的请求验证:

$request->validate([
    'email'    => 'required|string|email:filter',
    'password' => [
        'required',
        'confirmed',
        'string',
        new isValidPassword(),
    ],
]);

听起来像是正则表达式的好工作。

Laravel验证规则支持正则表达式。两个4。X和5。X版本支持它:

  • 4.2: http://laravel.com/docs/4.2/validation#rule-regex
  • 5.1: http://laravel.com/docs/5.1/validation#rule-regex

这可能也有帮助:

http://www.regular-expressions.info/unicode.html

使用laravel 8很容易做到这一点:

 $rules = array(
    'name'             => ['required'],                        
    'email'            => ['required','email','unique:ducks'],     
    'password'         => ['required', 'confirmed',Password::min(8)
                                                   ->letters()
                                                   ->mixedCase()
                                                   ->numbers()
                                                   ->symbols()
                                                   ->uncompromised()
                           ],
);

请参阅文档,(在您的情况下,您可以忽略未妥协规则)

laravel 9 password validation


 $request->validate([
    'name' => 'required', 'string', 'max:255',
    'email' => 'required', 'string', 'email', 'max:255', 'unique:users',
    'password' => 'required|string|min:6|confirmed|regex:/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{6,}$/',
 ]);