Django密码验证器:如果任何三个验证通过,用户可以继续进行

2024-06-17 09:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究如何设置必须通过的验证次数,以允许用户设置密码

例如,我们有以下5个validtors:

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怎么做吗


Tags: django用户nameauth密码passwordcontrib次数
1条回答
网友
1楼 · 发布于 2024-06-17 09:30:09

您可以将其他验证器包装在自定义验证器中:

# 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(),
            ]
        }
    },
]

相关问题 更多 >