在Django中,验证密码时如何访问request变量?

vddsk6oq  于 2023-06-25  发布在  Go
关注(0)|答案(1)|浏览(148)

在Django中,我需要创建一个自定义的密码验证器,它需要从数据库中读取密码策略配置。要做到这一点,我需要客户端ID,这通常是嵌入在请求变量,但在这种情况下,请求它不可用。是否有其他方法可以实现这一点?

class MinimumLengthValidator:
    """
    Validate whether the password is of a minimum length.
    """
    def __init__(self, min_length=8):
        self.min_length = min_length
        #get minimum length from client config here, typically request.client.config.password_min_length e.g. value is 10
kcrjzv8t

kcrjzv8t1#

简短回答:你会在这里找到一切:整合验证
长回答:
我认为最常见的方法是有一个自定义的用户模型。这意味着拥有你自己的用户模型,它是AbstractUser的子类。在那里你可以覆盖字段,添加字段和方法。很好。那么通过那个User模型的ModelForm创建一个User是完全有意义的。因此,从您的视图开始,您可以将客户端ID传递给提到的ModelForm__init__()方法,并按照@ybl的建议“将其传递到链中”。
但是看起来您的项目完全在django.contrib.auth上运行,没有对User模型进行任何修改。因此,你说的对,上面的解决方案是“很多”只是为了增加一个验证器。(最有可能的是,你将来无论如何都会添加一个自定义用户模型(更多信息),所以考虑一下这个选项)。
编写自定义验证器:

class CustomValidator:
    def __init__(self, client_id, pw_config):
        self.client_id = client_id
        self.pw_config = pw_config

    def validate(self, user=None):
        if self.client_id != xx and self.pw_config != xx:
            raise ValidationError(
                "pw not valid", 
                code='clientID_not_pwConfig',
                params={'pw_config': self.pw_config, 'client_id': self.client_id},
            )
        # in case pw is valid return None

    def get_help_text(self):
        return _(
            f"Your {self.client_id} does not match pw_config"
        )

然后在你看来(上面链接为“简短答案”的资源):

from django.contrib.auth.password_validation import get_password_validators, validate_password

def your_view(request):
    client_id = get_client_id()
    pw_config = get_pw_config()
    standard_validators = get_password_validators(settings.AUTH_PASSWORD_VALIDATORS)
    custom_validator = CustomValidator(client_id, pw_config)
    all_validators = standard_validators + [custom_validator]
    
    if validate_password(
        password,  # replace to your needs
        user=None,  # replace to your needs
        password_validators=all_validators
    ) is not None:
        # your pw is valid
    else:
        # your pw is not valid

相关问题