Laravel 密码验证规则

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

验证规则:

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

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

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

我的代码在这里

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


}
180707 次浏览

对于正则表达式来说,这听起来是个不错的工作。

Laravel 验证规则支持正则表达式,4.X 和5.X 版本都支持:

这可能也有帮助:

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

我在 Laravel 也遇到过类似的情况,并用以下方法解决了这个问题。

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

  • 英文大写字母(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. 我已经在正则表达式站点和 Laravel5测试环境中对它进行了测试和验证,它工作正常。
  2. 我使用了 min: 6,这是可选的,但是有一个反映不同方面的安全策略总是一个好的做法,其中之一是最小密码长度。
  3. 我建议您使用确认密码,以确保用户键入正确的密码。
  4. 在这6个字符中,我们的正则表达式应该至少包含3个 A-Z 或 A-Z 以及数字和特殊字符。
  5. 在转移到生产环境之前,始终在测试环境中测试代码。
  6. 我在这个答案中所做的只是正则表达式密码的例子

关于 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 验证规则允许开发人员为每个用例提供自定义消息,以获得更好的用户体验。

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 版本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'
],
]

用幼虫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,}$/',
]);