Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django 1.7中的自定义密码验证_Django_Django Admin_Django Authentication - Fatal编程技术网

django 1.7中的自定义密码验证

django 1.7中的自定义密码验证,django,django-admin,django-authentication,Django,Django Admin,Django Authentication,我正在尝试向创建用户和更改密码管理表单添加自定义密码验证。我在django文档中没有看到任何关于如何执行此操作的内容。我在SO上找到了这篇文章,它给出了两种解决方案。我两个都试过了,但都不管用 以下是我现在在apps admin.py中的内容: def validate_password_strength(value): """Validates that a password is as least 10 characters long and has at least 2 d

我正在尝试向创建用户和更改密码管理表单添加自定义密码验证。我在django文档中没有看到任何关于如何执行此操作的内容。我在SO上找到了这篇文章,它给出了两种解决方案。我两个都试过了,但都不管用

以下是我现在在apps 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)
我得到了这个错误:

<class 'elex_apis.energy.webservice.admin.UserAdmin'>: (admin.E016) The value of 'form' must inherit from '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)
但我还是犯了和以前一样的错误


我不敢相信添加密码验证器这么难。这一定是一个非常普遍的需要,所以很明显我肯定错过了一些简单的东西。有人能在这里提供一些帮助吗

最简单的方法是继承原始的
UserAdmin
,只需覆盖
change\u password\u表单

例如:

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)
从django.contrib.auth导入模型作为auth\u模型
从django.contrib.auth导入admin作为auth_admin
从django.contrib.auth导入表单作为auth_表单
从django.core.exceptions导入ValidationError
def验证密码强度(值):
“”“验证密码长度至少为10个字符,并且至少包含
2位数字和1个大写字母。
"""
最小长度=10
如果长度(值)<最小长度:
raise ValidationError(_('密码必须至少为{0}个字符'
“长。”)。格式(最小长度))
#检查是否有2位数字
如果总和(c.isdigit()表示c的值)<2:
raise ValidationError(\('密码必须至少包含2位数字'))
#检查大写字母
如果没有(c.isupper()表示c的值):
raise ValidationError(\('密码必须包含至少1个大写字母'))
返回值
类AdminPasswordChangeForm(auth_forms.AdminPasswordChangeForm):
def clean_密码1(自身):
返回验证密码强度(自清理的密码数据['password1'])
类UserCreationForm(auth_forms.UserCreationForm):
def clean_密码1(自身):
返回验证密码强度(自清理的密码数据['password1'])
类UserAdmin(auth_admin.UserAdmin):
change\u password\u form=AdminPasswordChangeForm
add_form=UserCreationForm
#重新注册用户管理员
admin.site.unregister(auth_models.User)
admin.site.register(auth_models.User,UserAdmin)

另一种方法是创建validators.py文件,并在其中基于对象创建自己的类,如果输入的密码失败,则引发ValidationError。更多关于它

使用验证程序的正确虚线路径更新验证程序密码验证程序设置:

AUTH_PASSWORD_VALIDATORS = [
    {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 12, }
     },
    {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', },
    {'NAME': 'my.project.validators.NumberValidator',
        'OPTIONS': {
            'min_digits': 3, }},
    {'NAME': 'my.project.validators.UppercaseValidator', },        
]

这确实验证了密码,但当输入有效密码且管理员返回上一页后,它会显示“未设置密码”。然而,当我查看数据库时,auth_user中有密码。@LarryMartell:oops。。。忘记添加
返回值
,请尝试使用新版本:)完美!非常感谢你!!
import re

from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _

class NumberValidator(object):
    def validate(self, password, user=None):
        if not re.findall('\d', password):
            raise ValidationError(
               _("The password must contain at least 1 digit, 0-9."),
               code='password_no_number',
            )

    def get_help_text(self):
        return _(
           "Your password must contain at least 1 digit, 0-9."
        )

class UppercaseValidator(object):
    def validate(self, password, user=None):
        if not re.findall('[A-Z]', password):
            raise ValidationError(
                _("The password must contain at least 1 uppercase letter, A-Z."),
                code='password_no_upper',
            )

    def get_help_text(self):
        return _(
            "Your password must contain at least 1 uppercase letter, A-Z."
        )
AUTH_PASSWORD_VALIDATORS = [
    {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 12, }
     },
    {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', },
    {'NAME': 'my.project.validators.NumberValidator',
        'OPTIONS': {
            'min_digits': 3, }},
    {'NAME': 'my.project.validators.UppercaseValidator', },        
]