Пользовательская проверка пароля в django 1.7 - программирование

Пользовательская проверка пароля в django 1.7

Я пытаюсь добавить пользовательскую проверку пароля для создания пользователя и смены пароля. Я ничего не видел в документах django о том, как это сделать. Я нашел этот пост на SO: Выполняя требования безопасности пароля с помощью django.contrib.auth.views.password_change, который дает 2 решения. Я пробовал обоим, но не работал у меня.

Вот что у меня теперь в моих приложениях admin.py:

def validate_password_strength(value):
    """Validates that a password is as least 10 characters long and has at least
    2 digits and 1 Upper case letter.
    """
    min_length = 10

    if len(value) < min_length:
        raise ValidationError(_('Password must be at least {0} characters '
                                'long.').format(min_length))

    # check for 2 digits
    if sum(c.isdigit() for c in value) < 2:
        raise ValidationError(_('Password must container at least 2 digits.'))

    # check for uppercase letter
    if not any(c.isupper() for c in value):
        raise ValidationError(_('Password must container at least 1 uppercase letter.'))

class MySetPasswordForm(SetPasswordForm):
    def __init__(self, *args, **kwargs):
        super(MySetPasswordForm, self).__init__(*args, **kwargs)
        self.fields['password1'].validators.append(validate_password_strength)

Но я не могу понять, как я могу использовать MySetPasswordForm.

Я пробовал несколько разных вещей. Сначала я сделал это:

class UserAdmin(UserAdmin):
    form = MySetPasswordForm

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)

И я получил эту ошибку:

<class 'elex_apis.energy.webservice.admin.UserAdmin'>: (admin.E016) The value of 'form' must inherit from 'BaseModelForm'.

Итак, я изменил MySetPasswordForm наследовать от BaseModelForm, а затем получил эту ошибку:

__init__() missing 1 required positional argument: 'user'

Итак, я добавил параметр пользователя, поэтому теперь MySetPasswordForm выглядит так:

class MySetPasswordForm(BaseModelForm):
    def __init__(self, user, *args, **kwargs):
        super(MySetPasswordForm, self).__init__(user, *args, **kwargs)
        self.fields['password1'].validators.append(validate_password_strength)

Но у меня все еще была та же ошибка, что и раньше.

Я не могу поверить, что это сложно добавить проверку пароля. Это должна быть очень общая потребность, поэтому я должен упустить что-то простое. Кто-нибудь может оказать некоторую помощь здесь.

4b9b3361

Ответ 1

Самый простой способ - наследовать исходный UserAdmin и просто переопределить change_password_form.

Пример:

from django.contrib.auth import models as auth_models
from django.contrib.auth import admin as auth_admin
from django.contrib.auth import forms as auth_forms
from django.core.exceptions import ValidationError


def validate_password_strength(value):
    """Validates that a password is as least 10 characters long and has at least
    2 digits and 1 Upper case letter.
    """
    min_length = 10

    if len(value) < min_length:
        raise ValidationError(_('Password must be at least {0} characters '
                                'long.').format(min_length))

    # check for 2 digits
    if sum(c.isdigit() for c in value) < 2:
        raise ValidationError(_('Password must container at least 2 digits.'))

    # check for uppercase letter
    if not any(c.isupper() for c in value):
        raise ValidationError(_('Password must container at least 1 uppercase letter.'))

    return value


class AdminPasswordChangeForm(auth_forms.AdminPasswordChangeForm):
    def clean_password1(self):
        return validate_password_strength(self.cleaned_data['password1'])


class UserCreationForm(auth_forms.UserCreationForm):
    def clean_password1(self):
        return validate_password_strength(self.cleaned_data['password1'])


class UserAdmin(auth_admin.UserAdmin):
    change_password_form = AdminPasswordChangeForm
    add_form = UserCreationForm


# Re-register UserAdmin
admin.site.unregister(auth_models.User)
admin.site.register(auth_models.User, UserAdmin)