Обеспечение требований к прочности пароля с помощью django.ВНО.автор.просмотр.изменение пароля

У нас есть Django приложение, которое требует определенного уровня сложности пароля. В настоящее время мы применяем это через клиентский JavaScript, который может быть легко побежден кем-то, кто должным образом мотивирован.

Я не могу найти никакой конкретной информации о настройке проверки силы пароля на стороне сервера с помощью встроенных представлений django contrib. Прежде чем я снова изобрету колесо, есть ли правильный способ справиться с этим требованием?

5 ответов


Я также пошел с пользовательской формой для этого. В 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

Django 1.9 предлагает встроенный проверка пароля чтобы предотвратить использование слабых паролей пользователями. Он включен путем изменения AUTH_PASSWORD_VALIDATORS настройки в нашем проекте. По умолчанию Django поставляется со следующими валидаторами:

  • UserAttributeSimilarityValidator, который проверяет сходство между пароль и набор атрибутов пользователя.
  • MinimumLengthValidator, которая просто проверяет, является ли пароль соответствует минимальной длине. Этот валидатор настроен традиция опция: теперь требуется, чтобы минимальная длина составляла девять символов, вместо восьмерки по умолчанию.
  • CommonPasswordValidator, который проверяет встречается ли пароль в списке распространенных паролей. От по умолчанию он сравнивается с включенным списком из 1000 общих паролей.
  • NumericPasswordValidator, который проверяет, не является ли пароль полностью числовой.

этот пример включает все четыре включенных валидатора:

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',
    },
]

как некоторые ускользнули от пользовательских валидаторов, вот подход, который я бы принял...

создать валидатор:

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)

Я бы просто установил django-passwords и позволил этому справиться с этим для вас:https://github.com/dstufft/django-passwords

после этого вы можете просто подкласс регистрационной формы и заменить поле с PasswordField.


Я думаю, вы должны просто написать свой собственный валидатор ( или использовать RegexValidator, см.:http://docs.djangoproject.com/en/dev/ref/validators/) Если вы используете формы или пишете какой-либо другой скрипт, проверяющий регулярные выражения. Это должна быть простая задача. Также я не думаю, что есть какой-либо встроенный механизм, просто потому, что каждый человек понимает концепцию "сильного пароля" немного по-другому.