Django使用AUTH_password_验证器验证密码

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

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

我有一个自定义的User模型,它只包含两个必填字段:emailpassword。在

我还有一个自定义的UserCreationForm,它提示用户输入他们的email和一个password。在

不幸的是,除了min_length,表单不验证密码。在

如何在settings.AUTH_PASSWORD_VALIDATORS中启用密码验证器?对象是distc的列表,而不是验证器,所以我不确定如何使用它们。在

class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(
        widget=forms.PasswordInput(attrs=form_attrs.password),
        min_length=8,
        strip=True,
    )

    class Meta:
        model = User
        fields = ('email',)
        widgets = {
            'email': forms.EmailInput(attrs=form_attrs.email),
        }

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data.get('password1'))
        if commit:
            user.save()
        return user

Tags: form密码emailsaveformspasswordminlength
2条回答

django应用于其内置表单的方式是

def get_password_validators(validator_config):
    validators = []
    for validator in validator_config:
        try:
            klass = import_string(validator['NAME'])
        except ImportError:
            msg = "The module in NAME could not be imported: %s. Check your AUTH_PASSWORD_VALIDATORS setting."
            raise ImproperlyConfigured(msg % validator['NAME'])
        validators.append(klass(**validator.get('OPTIONS', {})))

    return validators

在此之后,将在表单内部手动进行验证。在

这意味着您可以从django.contrib.auth导入password_validation,并使用

^{pr2}$

此函数用于获取验证器和窗体内部

^{3}$

你可以看看内置的登记表是怎么做到的。在

正如另一个回答者提到的,Django使用django.contrib.auth.password_validation.validate_password方法来验证密码。您可以创建一个clean_password1方法并将其添加到其中,如下所示:

class UserCreationForm(forms.ModelForm):
    password1 = forms.CharField(
        widget=forms.PasswordInput(attrs=form_attrs.password),
        min_length=8,
        strip=True,
    )

    class Meta:
        model = User
        fields = ('email',)
        widgets = {
            'email': forms.EmailInput(attrs=form_attrs.email),
        }

    def clean_password1(self):
        password1 = self.cleaned_data.get('password1')
        try:
            password_validation.validate_password(password1, self.instance)
        except forms.ValidationError as error:

            # Method inherited from BaseForm
            self.add_error('password1', error)
        return password1

相关问题 更多 >