web-dev-qa-db-ja.com

Django.contrib.auth.views.password_changeによるパスワード強度要件の適用

Djangoアプリケーションには特定のレベルのパスワードの複雑さが必要です。現在、クライアント側のJavaScriptを介してこれを実施しています。これは、適切な動機を持つ人によって簡単に打ち負かされる可能性があります。

Django contrib built in viewsを使用したサーバー側のパスワード強度検証の設定に関する具体的な情報が見つからないようです。ホイールを再発明する前に、適切な方法がありますか?この要件を処理しますか?

46
jslatts

このためのカスタムフォームも使用しました。 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
40
EMP

Django 1.9は、組み込みの password validation を提供して、ユーザーによる弱いパスワードの使用を防ぎます。プロジェクトのAUTH_PASSWORD_VALIDATORS設定を変更することで有効になります。デフォルトではDjangoには以下のバリデータが付属しています:

  • UserAttributeSimilarityValidator:パスワードとユーザーの一連の属性との類似性をチェックします。
  • MinimumLengthValidatorは、パスワードが最小長を満たしているかどうかを確認するだけです。このバリデーターはカスタムオプションで構成されています。デフォルトの8文字ではなく、9文字にする必要があります。
  • CommonPasswordValidator:一般的なパスワードのリストにパスワードが含まれているかどうかをチェックします。デフォルトでは、含まれている1000の一般的なパスワードのリストと比較されます。
  • NumericPasswordValidator。パスワードが完全に数字ではないかどうかを確認します。

この例では、含まれている4つのバリデーターをすべて有効にします。

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

一部のカスタムバリデーターを回避したように、私が取るアプローチは次のとおりです...

バリデーターを作成します。

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)
14
Troy Grosfield

私はDjango-passwordsをインストールしてそれを処理させます: https://github.com/dstufft/Django-passwords

その後、登録フォームをサブクラス化して、フィールドをPasswordFieldに置き換えることができます。

10
Alper

フォームを使用するか、他の何かを作成する場合は、独自のバリデーターを作成する必要があると思います(またはRegexValidatorを使用してください。参照 http://docs.djangoproject.com/en/dev/ref/validators/ )正規表現のスクリプトチェック。これは簡単な作業です。また、個人が「強力なパスワード」の概念を少しずつ理解しているからといって、組み込みのメカニズムはないと思います。

2
freakish