Django 密码验证器:如果任何三个验证通过,用户可以继续
Django Password Validators: If any three of the validations pass user can go ahead
我正在研究如何设置允许用户设置密码必须通过的验证次数。
例如,我们有这 5 个验证器:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
{ 'NAME': 'registration.validators.CustomPasswordValidator',}
]
我们想知道用户密码是否通过了他们的 3 个要求中的任何一个。用户可以创建一个帐户。知道我们如何在 Django 中做到这一点吗?
您可以将其他验证器包装在自定义验证器中:
# pw.py
class WrapPasswordValidator:
def __init__(self, validators=None, num=3):
self.validators = validators or []
self.num = num
def validate(self, password, user=None):
errors, passed = [], 0
for v in self.validators:
try:
v.validate(password, user)
except ValidationError as e:
errors.append(e)
else:
passed += 1
if passed < self.num:
errors.insert(0, ValidationError("Fix at least {} of the following errors:".format(
self.num-passed)))
raise ValidationError(errors)
def get_help_text(self):
text = ngettext(
"Password must comply with at least %(num)d rule of:",
"Password must comply with at least %(num)d rules of:",
self.num
) % {'num': self.num}
for v in self.validators:
text += '<br>' + v.get_help_text()
return mark_safe(text)
并在您的设置中使用它:
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "pw.WrapPasswordValidator",
"OPTIONS": {
"num": 3,
"validators": [
UserAttributeSimilarityValidator(),
MinimumLengthValidator(),
CommonPasswordValidator(),
NumericPasswordValidator(),
]
}
},
]
我正在研究如何设置允许用户设置密码必须通过的验证次数。
例如,我们有这 5 个验证器:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
{ 'NAME': 'registration.validators.CustomPasswordValidator',}
]
我们想知道用户密码是否通过了他们的 3 个要求中的任何一个。用户可以创建一个帐户。知道我们如何在 Django 中做到这一点吗?
您可以将其他验证器包装在自定义验证器中:
# pw.py
class WrapPasswordValidator:
def __init__(self, validators=None, num=3):
self.validators = validators or []
self.num = num
def validate(self, password, user=None):
errors, passed = [], 0
for v in self.validators:
try:
v.validate(password, user)
except ValidationError as e:
errors.append(e)
else:
passed += 1
if passed < self.num:
errors.insert(0, ValidationError("Fix at least {} of the following errors:".format(
self.num-passed)))
raise ValidationError(errors)
def get_help_text(self):
text = ngettext(
"Password must comply with at least %(num)d rule of:",
"Password must comply with at least %(num)d rules of:",
self.num
) % {'num': self.num}
for v in self.validators:
text += '<br>' + v.get_help_text()
return mark_safe(text)
并在您的设置中使用它:
AUTH_PASSWORD_VALIDATORS = [
{
"NAME": "pw.WrapPasswordValidator",
"OPTIONS": {
"num": 3,
"validators": [
UserAttributeSimilarityValidator(),
MinimumLengthValidator(),
CommonPasswordValidator(),
NumericPasswordValidator(),
]
}
},
]