Как установить минимальную длину пароля при использовании встроенного модуля аутентификации Django?

Я реализую аутентификацию на сайте Django, используя встроенный модуль аутентификации , включая встроенный UserCreationForm.

Я хотел бы установить минимальную длину паролей. Однако я не могу найти документацию о том, как это сделать.

Могу ли я настроить модуль User модуля аутентификации, чтобы он требовал этого на уровне базы данных? Или мне следует создать подкласс UserCreationForm (на самом деле я уже делаю это по несвязанным причинам) и добавить дополнительный валидатор, который обеспечивает длину пароля?


person Paul D. Waite    schedule 28.02.2012    source источник


Ответы (5)


Особенно, если вы уже используете подкласс 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()
person Chris Pratt    schedule 28.02.2012
comment
2 вопроса: 1) Зачем здесь использовать super()? Почему не return password? 2) Я получаю AttributeError: 'super' object has no attribute 'clean_password'. Что может быть причиной этого? - person Brian Dant; 23.06.2013
comment
Это должно быть clean_password1, а не clean_passwordself.cleaned_data.get('password1')), так как UserCreationForm имеет password1 и password2 для подтверждения. - person Kevin Stone; 24.08.2013
comment
Существует лучший способ. См. другой ответ: stackoverflow.com/a/39714008/3708462 - person Emdadul Sawon; 07.03.2018
comment
Какова минимальная длина по умолчанию, если AUTH_PASSWORD_VALIDATORS не используется? Как проверить, есть ли способ? - person Timo; 18.07.2018


Подкласс формы создания пользователя звучит как хороший подход. Вы не можете применить его на уровне базы данных, так как Django хранит только хэш пароля.

person Alasdair    schedule 28.02.2012

/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}
person Stan Zeez    schedule 27.11.2015

Немного информации об ответах,

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})
person Mohideen bin Mohammed    schedule 14.10.2019