【问题标题】:Specify Minimum Password Length in Django Version <= 1.8?在 Django 版本 <= 1.8 中指定最小密码长度?
【发布时间】:2016-07-15 14:33:45
【问题描述】:

如果您使用 Django 1.8 或更低版本,当用户更改密码时,是否可以强制执行最小密码长度?当用户在我的网站中创建他们的帐户时,我会在我的注册表单中使用自定义验证器强制设置最小密码长度。但是,当用户想要更改密码时,我会调用 Django 的 auth_views.password_change 方法,该方法指定使用的表单和验证条件。

# account/urls.py
from django.conf.urls import url
from django.contrib.auth import views as auth_views
urlpatterns = [
    ...
    url(r'^password_change/$',
        auth_views.password_change,
        {'template_name': 'password_change_form.html'},
        name='password_change'),
    ...
]

由于我没有验证他们的新密码,因此用户可以将其更改为不符合我的最小长度标准的密码。除了猴子补丁之外,还有其他方法可以进行此验证吗?这个 Stackover question 讨论了一种可行的方法,但它适用于您正在实施身份验证而我只允许经过身份验证的用户更改其现有密码的情况。我知道 Django 1.9 将通过 AUTH_PASSWORD_VALIDATORS 设置提供此功能,但在我的网站上线之前我没有时间升级到 1.9。

【问题讨论】:

  • 您可以创建一个继承自PasswordChangeForm 的新表单,使用clean_new_password1 自定义“new_password1”字段(添加您的验证),并在您的url{'password_change_form': CustomPasswordChangeForm}, /b> 以呈现此表单而不是默认表单。如果需要,您可以使用视图,如果有帮助,请参阅 here

标签: django django-authentication


【解决方案1】:

您可以自定义默认的PasswordChangeForm 表单并传递 password_change_form 额外选项以通过 url 指向您的 CustomPasswordChangeForm 表单而不是默认表单来查看函数。

from django.contrib.auth.forms import PasswordChangeForm


class CustomPasswordChangeForm(PasswordChangeForm):
    """
    A Custom PasswordChangeForm for minimum password length validation.
    """

    def clean_new_password1(self):
        """
        Validates that the new_password1.
        """
        password = self.cleaned_data.get('new_password1')
        # Add your custom validation
        if len(password) < 8:
            raise ValidationError('Password too short')
        return password

并更改网址:

from django.conf.urls import url
from django.contrib.auth import views as auth_views
from _where_ import CustomPasswordChangeForm #import the CustomPasswordChangeFormform 

urlpatterns = [
    ...
    url(r'^password_change/$',
        auth_views.password_change,
        {'template_name': 'password_change_form.html', 'password_change_form': CustomPasswordChangeForm},
        name='password_change'),
    ...
]

【讨论】:

  • 这几乎可以工作。它确实捕获了一个太短的密码,但如果您输入有效密码并重新提交表单,则会引发 AttributeError,“'super' object has no attribute 'clean_new_password1'”。我在调试器中运行它并确认没有这种方法。你也许还有别的意思?我想知道您是否真的是指“super(CustomPasswordChangeForm,..)”,但这会引发同样的错误。
  • 我没有测试它。它只是在飞行中编码。还有 'super'(PasswordChangeForm) object has no attribute 'clean_new_password1' ,它的 self(CustomPasswordChangeForm) 拥有它。使用return password 而不是super(..)
  • 感谢有关隐藏字段的建议。我已经适当地更改了我的代码。
猜你喜欢
  • 1970-01-01
  • 2013-06-28
  • 2012-03-18
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
相关资源
最近更新 更多