Как установить минимальную длину пароля при использовании встроенного модуля авторизации Django?
Im реализует аутентификацию на сайте Django с помощью встроенного модуля auth, включая встроенный UserCreationForm
.
Id как установить минимальную длину для паролей. Однако я не могу найти документацию о том, как это сделать.
Могу ли я настроить модуль auth modules User
, чтобы потребовать его на уровне базы данных? Или я должен подклассифицировать UserCreationForm
(Im фактически делает это уже по несвязанным причинам) и добавить дополнительный валидатор, который применяет длину пароля?
Ответы
Ответ 1
Особенно, если вы уже используете подклассифицированный 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()
Ответ 2
Я думаю, что самый простой способ добиться этого - использовать проверку паролей Django
Для минимальной длины достаточно добавить это в файл настроек:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 8,
}
},
]
Существуют и другие валидаторы, такие как NumericPasswordValidator
и CommonPasswordValidator
Ответ 3
Подклассификация формы создания пользователя звучит как хороший подход. Вы не можете принудительно применять его на уровне базы данных, поскольку Django хранит только хэш пароля.
Ответ 4
/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}
Ответ 5
Некоторая информация об ответах,
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 = "[~\[email protected]#\$%\^&\*\(\)_\+{}\":;'\[\]]"
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})