Python Django身份验证函数,该函数接受额外字段

Python Django身份验证函数,该函数接受额外字段,python,django,django-rest-framework,Python,Django,Django Rest Framework,django authenticate函数接受两个参数,例如 user = authenticate(username=username, password=password) ,但我想传入一个附加参数来验证条目。这样做是可能的,还是可以重写authenticate函数来实现这一点 请告知,谢谢。只是一个python函数,您可以使用它来传递多个参数,您可以覆盖authenticate方法,如()来添加您自己的验证 据我所知,authenticate()函数将任何关键字参数作为凭据。它只是将凭据

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

user = authenticate(username=username, password=password)
,但我想传入一个附加参数来验证条目。这样做是可能的,还是可以重写authenticate函数来实现这一点


请告知,谢谢。

只是一个python函数,您可以使用它来传递多个参数,您可以覆盖authenticate方法,如()来添加您自己的验证

据我所知,
authenticate()
函数将任何关键字参数作为凭据。它只是将凭据转发到配置的身份验证后端。因此,这实际上取决于身份验证后端对传递的参数所做的操作

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

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'confirm.django.auth.backends.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
当用户使用电子邮件地址登录时,凭据将传递到
modelbindend.authenticate()
方法,该方法将失败,因为没有与电子邮件地址匹配的用户名。然后,调用
EmailBackend.authenticate()
方法,该方法将成功(如果密码匹配)。第一个后端返回
用户
实例“wins”

所以这取决于你想做什么

如果您只是想允许用户使用其用户名或电子邮件地址(或任何其他字段)登录,那么这是一种方法。只需创建一个新的身份验证后端,并将其与django.contrib.auth.BACKENDS.modelbend一起添加到
AUTHENTICATION\u BACKENDS

如果您需要为登录验证一个附加字段,比如说一个三元组,如
客户ID
用户名
&
密码
,您还需要创建自己的后端。但是,这次后端应该是在
AUTHENTICATION\u BACKENDS
中配置的唯一后端,从而用它替换
django.contrib.auth.BACKENDS.modelbend

如果您想了解有关自定义身份验证的更多信息,请访问