【问题标题】:Django AUTH_PASSWORD_VALIDATORS check for symbols and other requirementsDjango AUTH_PASSWORD_VALIDATORS 检查符号和其他要求
【发布时间】:2021-07-13 07:02:48
【问题描述】:

是否可以验证密码要求,例如:

  • 一个大写字母
  • 两个符号

使用 Django 的内置密码管理?例如这些:

django.contrib.auth.password_validation.UserAttributeSimilarityValidator
django.contrib.auth.password_validation.MinimumLengthValidator
django.contrib.auth.password_validation.CommonPasswordValidator
django.contrib.auth.password_validation.NumericPasswordValidator

我发现以下 Python 包可以满足我的需求,但我想知道它是否可以在本地完成:

https://pypi.org/project/django-password-validators/

谢谢!

【问题讨论】:

    标签: python django web-applications passwords


    【解决方案1】:

    你可以write your own validator Django 的密码验证器有一个相当小的接口。他们必须实现两种方法:

    validate(self, password, user=None) 如果密码有效,则必须返回 None,或者如果密码无效,则引发带有错误消息的 ValidationError。您必须能够处理用户为 None - 如果这意味着您的验证器无法运行,则返回 None 以表示没有错误。在大多数情况下,您甚至不需要用户验证密码(更适用于我们想要防止密码重用的情况) get_help_text() 必须提供一些帮助文本来向用户解释密码要求。

    AUTH_PASSWORD_VALIDATORS 中的 OPTIONS 中的任何项目都将传递给您的验证器。所有构造函数参数都应该有一个默认值。

    from django.core.exceptions import ValidationError
    from django.utils.translation import gettext as _
    
    class CaptialAndSymbolValidator:
        def __init__(self, number_of_capitals=1, number_of_symbols=2, symbols="[~!@#$%^&*()_+{}\":;'[]"):
            self.number_of_capitals = number_of_capitals
            self.number_of_symbols = number_of_symbols
            self.symbols = symbols
    
        def validate(self, password, user=None):
            capitals = [char for char in password if char.isupper()]
            symbols = [char for char in password if char in self.symbols]
            if len(capitals) < self.number_of_capitals:
                raise ValidationError(
                    _("This password must contain at least %(min_length)d capital letters."),
                    code='password_too_short',
                    params={'min_length': self.number_of_capitals},
                )
            if len(symbols) < self.number_of_symbols:
                raise ValidationError(
                    _("This password must contain at least %(min_length)d symbols."),
                    code='password_too_short',
                    params={'min_length': self.number_of_symbols},
                )
    
        def get_help_text(self):
            return _(
                "Your password must contain at least %(number_of_capitals)d capital letters and %(number_of_symbols) symbols."
                % {'number_of_capitals': self.number_of_capitals, 'number_of_symbols': self.number_of_symbols}
            )
    
    
    AUTH_PASSWORD_VALIDATORS = [
        ...
        {
        'NAME': 'path.to.your.validators.CaptialAndSymbolValidator',
        'OPTIONS': {
            # use this to override any of the defaults
            'symbols': "@^#",
            }
        },
    ]
    

    【讨论】:

    • 谢谢,刚刚实现了这个。我不太确定路径是什么,如果它位于 main/testing/validators/validate.py 会是 main.testing.validators.validate.CapitalAndSymbolValidator 吗?
    • 是的,这是正确的(假设 main 是您的 manage.py 文件所在的文件夹)
    • @andredms 考虑将此答案验证为当前答案。它对我有用。谢谢雷斯利罗德里格斯
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2015-03-04
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    相关资源
    最近更新 更多