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

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

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

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

Ответы [ 4 ]

21 голосов
/ 27 сентября 2016

Я думаю, что самый простой способ добиться этого - использовать Проверка пароля Django

Для минимальной длины будет достаточно добавить это в файл настроек:

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 8,
        }
    },
]

Тамдругие валидаторы, такие как NumericPasswordValidator и CommonPasswordValidator

8 голосов
/ 28 февраля 2012

Особенно, если вы уже используете подкласс 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()
5 голосов
/ 28 февраля 2012

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

1 голос
/ 27 ноября 2015

/ 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}
...