Django AUTH_密码_验证器检查符号和其他要求

2024-06-17 11:46:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

使用Django的内置密码管理?e、 g.这些:

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/

谢谢


Tags: djangohttpsauth密码符号password大写字母contrib
1条回答
网友
1楼 · 发布于 2024-06-17 11:46:37

你可以write your own validator Django的密码验证器有一个相当小的界面。它们必须实施两种方法:

validate(self, password, user=None)如果密码有效,则必须返回None;如果密码无效,则必须发出带有错误消息的ValidationError。您必须能够处理“无”用户-如果这意味着您的验证器无法运行,则返回“无”表示无错误。在大多数情况下,您甚至不需要用户验证密码(更适用于我们希望防止密码重复使用的情况) 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': "@^#",
        }
    },
]

相关问题 更多 >