如何在使用内置Django身份验证模块时设置密码的最小长度?

16
我正在使用Django网站中的内置身份验证模块实现身份验证,包括内置的UserCreationForm
我想设置密码的最小长度。然而,我找不到任何关于如何做到这一点的文档。
我能否配置auth模块的User模块以在数据库级别要求此功能?或者,我应该子类化UserCreationForm(实际上,我已经因为其他原因在这样做了),并添加一个额外的验证器来强制执行密码长度?
5个回答

44
我认为实现这个最简单的方法是使用Django密码验证
要设置最小长度,只需要将以下内容添加到设置文件中即可:
AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 8,
        }
    },
]

还有其他的验证器,比如 NumericPasswordValidatorCommonPasswordValidator


2
这是更好的答案!如果内置密码验证机制,请勿操纵干净的方法! - allcaps
1
完美适用于Django 2+和Wagtail 2+。 - Kalob Taulien

8

特别是如果您已经在使用子类化的UserCreationForm,那么我建议您一定要将验证添加到该表单中。 您应该能够在表单上覆盖clean_password方法:

def clean_password(self):
    password = self.cleaned_data.get('password1')
    if len(password) < 8:
        raise ValidationError('Password too short')
    return super(MyUserCreationForm, self).clean_password1()

1
2个问题:1)为什么在这里使用super()?为什么不用return password?2)我得到了一个AttributeError: 'super' object has no attribute 'clean_password'。可能是什么原因导致的? - Brian Dant
1
еә”иҜҘдҪҝз”Ё clean_password1 иҖҢдёҚжҳҜ clean_passwordпјҲд»ҘеҸҠ self.cleaned_data.get('password1')пјүпјҢеӣ дёә UserCreationForm жңүдёҖдёӘ password1 е’Ң password2 з”ЁдәҺзЎ®и®ӨгҖӮ - Kevin Stone
有更好的方法。请查看其他答案:https://dev59.com/wmkx5IYBdhLWcg3wCP2Y#39714008 - Emdadul Sawon
如果未使用AUTH_PASSWORD_VALIDATORS,默认的最小长度是多少?我该如何检查,有什么方法吗? - Timo

4

以子类化用户创建表单的方式似乎是一个不错的方法。由于Django只存储密码的哈希值,因此无法在数据库级别上强制执行。


1
一些关于答案的信息,
django.contrib.auth.password_validation.MinimumLengthValidator

这个功能是从Django 1.9+开始新实现的,旧版本不支持,

因此您可以使用自定义验证器。

from django.core.exceptions import ValidationError
from django.utils.translation import ugettext

def validate(min_length, password):
    special_characters = "[~\!@#\$%\^&\*\(\)_\+{}\":;'\[\]]"
    if len(password) < 8:
        raise ValidationError(ugettext('Password length must be greater than 8 character.'))
    if not any(char.isdigit() for char in password):
        raise ValidationError(ugettext('Password must contain at least %(min_length)d digit.') % {'min_length': min_length})
    if not any(char.isalpha() for char in password):
        raise ValidationError(ugettext('Password must contain at least %(min_length)d letter.') % {'min_length': min_length})
    if not any(char in special_characters for char in password):
        raise ValidationError(ugettext('Password must contain at least %(min_length)d special character.') % {'min_length': min_length})

0

/django/contrib/auth/password_validation.py 包含类 MinimumLengthValidator,其默认密码最小长度为:

class MinimumLengthValidator(object):
    """
    Validate whether the password is of a minimum length.
    """
    def __init__(self, min_length=8):
        self.min_length = min_length

    def validate(self, password, user=None):
        if len(password) < self.min_length:
            raise ValidationError(
                ungettext(
                    "This password is too short. It must contain at least %(min_length)d character.",
                    "This password is too short. It must contain at least %(min_length)d characters.",
                    self.min_length
                ),
                code='password_too_short',
                params={'min_length': self.min_length},
            )

    def get_help_text(self):
        return ungettext(
            "Your password must contain at least %(min_length)d character.",
            "Your password must contain at least %(min_length)d characters.",
            self.min_length
        ) % {'min_length': self.min_length}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接