Выполнение требований к надежности пароля с помощью django.contrib.auth.views.password_change
У нас есть приложение Django, для которого требуется определенный уровень сложности пароля. В настоящее время мы применяем это через клиентский JavaScript, который легко может быть побежден кем-то, кто имеет соответствующую мотивацию.
Я не могу найти какую-либо конкретную информацию о настройке проверки надежности пароля на стороне сервера, используя django contrib, встроенный в представления. Прежде чем я передумаю изобретать колесо, есть ли подходящий способ справиться с этим требованием?
Ответы
Ответ 1
Я также пошел с пользовательской формой для этого. В urls.py
укажите свою собственную форму:
(r'^change_password/$', 'django.contrib.auth.views.password_change',
{'password_change_form': ValidatingPasswordChangeForm}),
Наследовать от PasswordChangeForm
и выполнить проверку:
from django import forms
from django.contrib import auth
class ValidatingPasswordChangeForm(auth.forms.PasswordChangeForm):
MIN_LENGTH = 8
def clean_new_password1(self):
password1 = self.cleaned_data.get('new_password1')
# At least MIN_LENGTH long
if len(password1) < self.MIN_LENGTH:
raise forms.ValidationError("The new password must be at least %d characters long." % self.MIN_LENGTH)
# At least one letter and one non-letter
first_isalpha = password1[0].isalpha()
if all(c.isalpha() == first_isalpha for c in password1):
raise forms.ValidationError("The new password must contain at least one letter and at least one digit or" \
" punctuation character.")
# ... any other validation you want ...
return password1
Ответ 2
Django 1.9 предлагает встроенную проверку пароля, чтобы предотвратить использование слабых паролей пользователями. Это разрешено изменением настройки AUTH_PASSWORD_VALIDATORS
в нашем проекте. По умолчанию Django поставляется со следующими валидаторами:
-
UserAttributeSimilarityValidator
, который проверяет сходство между
пароль и набор атрибутов пользователя.
-
MinimumLengthValidator
, который просто проверяет, является ли пароль
соответствует минимальной длине. Этот валидатор настроен на пользовательский
option: теперь требуется минимальная длина, равная девяти символам,
вместо восьми по умолчанию.
-
CommonPasswordValidator
, который проверяет
возникает ли пароль в списке общих паролей. От
по умолчанию, он сравнивается с включенным списком из 1000 общих паролей.
-
NumericPasswordValidator
, который проверяет, не является ли пароль isnt
полностью числовое.
В этом примере задействованы все четыре включенных валидатора:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 9,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
Ответ 3
Я бы просто установил django-пароли и разрешил это обрабатывать для вас: https://github.com/dstufft/django-passwords
После этого вы можете просто подклассифицировать регистрационную форму и заменить поле на PasswordField.
Ответ 4
Как некоторые ускользнули от пользовательских валидаторов, здесь подход, который я бы взял...
Создать валидатор:
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _
def validate_password_strength(value):
"""Validates that a password is as least 7 characters long and has at least
1 digit and 1 letter.
"""
min_length = 7
if len(value) < min_length:
raise ValidationError(_('Password must be at least {0} characters '
'long.').format(min_length))
# check for digit
if not any(char.isdigit() for char in value):
raise ValidationError(_('Password must contain at least 1 digit.'))
# check for letter
if not any(char.isalpha() for char in value):
raise ValidationError(_('Password must contain at least 1 letter.'))
Затем добавьте валидатор в поле формы, которое вы хотите проверить:
from django.contrib.auth.forms import SetPasswordForm
class MySetPasswordForm(SetPasswordForm):
def __init__(self, *args, **kwargs):
super(MySetPasswordForm, self).__init__(*args, **kwargs)
self.fields['new_password1'].validators.append(validate_password_strength)
Ответ 5
Я думаю, вы должны просто написать свой собственный валидатор (или использовать RegexValidator, см. http://docs.djangoproject.com/en/dev/ref/validators/), если вы используете формы или записываете некоторые другие script проверка регулярных выражений. Это должна быть простая задача. Также я не думаю, что есть какой-либо встроенный механизм, просто потому, что каждый человек понимает понятие "сильный пароль" немного по-другому.