Обеспечение требований к надежности пароля с помощью django.contrib.auth.views.password_change - PullRequest
45 голосов
/ 08 марта 2011

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

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

Ответы [ 5 ]

40 голосов
/ 15 июня 2011

Я также выбрал специальную форму для этого. В 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
26 голосов
/ 03 сентября 2015

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',
    },
]
14 голосов
/ 30 июля 2014

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

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

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)
10 голосов
/ 21 марта 2013

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

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

2 голосов
/ 08 марта 2011

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

...