Django验证接受额外字段的函数

时间:2018-04-12 12:25:18

标签: python django django-rest-framework

django authenticate函数接受两个参数,例如

user = authenticate(username=username, password=password)

,但我想传入一个额外的参数来验证条目。这可能是这样做还是可以覆盖身份验证功能来实现这一目标?

请指教,谢谢。

2 个答案:

答案 0 :(得分:1)

authenticate只是一个python函数,你可以使用*args & **kwargs传递多个参数,你可以覆盖像(How to override authenticate method )这样的验证方法,在那里添加你自己的验证。

答案 1 :(得分:1)

据我所知,authenticate()函数将任何关键字参数作为凭据。它只是将凭据转发到配置的身份验证后端。所以它真的取决于身份验证后端你用传递的参数做什么。

这意味着您可以将任意内容传递给authenticate()函数,但您可能需要实现自己的身份验证后端。您可以通过在settings.py

中指定自定义身份验证后端来实现这一目标
AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'confirm.django.auth.backends.EmailBackend',
)

这是EmailBackend的代码:

from django.contrib.auth.backends import ModelBackend, UserModel


class EmailBackend(ModelBackend):  # pylint: disable=too-few-public-methods
    '''
    Authentication backend class which authenticates the user against his
    e-mail address instead of his username.
    '''

    def authenticate(self, username=None, password=None, **kwargs):  # pylint: disable=unused-argument
        '''
        Authenticate the user via his e-mail address.

        :param str username: The username used to authenticate
        :param str password: The password used to authenticate
        :return: When successful, the User model is returned
        :rtype: User model or None
        '''
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password) and self.user_can_authenticate(user):
                return user

        return None

当用户使用电子邮件地址登录时,凭据将传递给ModelBackend.authenticate()方法,该方法将失败,因为没有与电子邮件地址匹配的用户名。之后,调用EmailBackend.authenticate()方法,该方法将成功(如果密码匹配)。返回User实例的第一个后端"赢得"。

所以这取决于你想做什么。

如果您只是想让用户使用他们的用户名或电子邮件地址(或任何其他字段)登录,那么这就是您的选择。只需创建一个新的身份验证后端,然后将其与AUTHENTICATION_BACKENDS一起添加到django.contrib.auth.backends.ModelBackend

如果您需要为登录验证其他字段,请使用customer IDusername和& password,您还需要创建自己的后端。但是,这次后端应该是AUTHENTICATION_BACKENDS中配置的唯一一个,因此用它替换django.contrib.auth.backends.ModelBackend

如果您想了解有关自定义身份验证的详情,请转到brilliant docs