drf重写authenticate方法实现多条件登录(源码分析)

这篇具有很好参考价值的文章主要介绍了drf重写authenticate方法实现多条件登录(源码分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

drf重写authenticate方法实现多条件登录(源码分析)

1. 思路

JWT拓展的登录视图中, 在接受到用户名和密码时, 调用的也是Django的认证系统中提供的authenticate()来检查用户名与密码是否正确.

我们可以通过修改Django系统的认证后端来支持登录账号既可以是用户名也可以是手机号

修改重写思路是:

修改Django认证系统的认证后端需要继承django.contrib.auth.backends.ModelBackends, 并重写authenticate方法

我们需要重写什么位置?

因为我们的需求是多条件登录, 所以我们就应该着手于数据库校验操作, 寻找定位源码中数据库校验username是否存在的操作, 并使用Q查询添加多个条件验证

2. 源码分析

下面是以from rest_framework_jwt.views import obtain_jwt_token为入口进行的源码分析(序号为查找流程):

drf重写authenticate方法实现多条件登录(源码分析)

  • 继承JsonWebTokenAPIView视图, 当接受到用户post请求时, 执行get_serializer()

  • 调用get_serializer()方法找到子类中定义的serializer类

  • 当调用is_valid()方法时, 会调用到validate()

  • 这里调用了authenticate方法并传入了用户数据, 返回的对象user

drf重写authenticate方法实现多条件登录(源码分析)

  • authenticate方法中调用了_get_backneds()方法, 此方法中将配置文件AUTHENTICATION_BACKENDS读取, 这个是django默认的配置, 我们重写方法之后, 需要将我们的类也配置到这里
  • django的默认配置文件路径 django>conf>global_settings.py>AUTHENTICATION_BACKENDS
  • 读取了配置文件之后调用到了ModelBackend中的authenticate方法
  • authenticate方法
    • 获取username
    • 携带username进行查表操作, 返回user对象
    • 如果查到user,就去验证其密码的正确性
  • 所以我们就可以重写的ModelBackend中的authenticate方法(修改数据库操作)

3. 代码实现

在utils/authenticate.py中:

from django.contrib.auth.backends import ModelBackend, UserModel
from django.db.models import Q


def get_user_by_account(account):

    """
    根据帐号信息获取user模型实例对象
    :param account: 账号信息,可以是用户名,也可以是手机号,甚至其他的可用于识别用户身份的字段信息
    :return: User对象 或者 None
    """
    user = UserModel.objects.filter(Q(mobile=account) | Q(username=account) | Q(email=account)).first()
    return user


class CustomAuthBackend(ModelBackend):
    """
    自定义用户认证类[实现多条件登录]
    """
    def authenticate(self, request, username=None, password=None, **kwargs):
        """
        多条件认证方法
        :param request: 本次客户端的http请求对象
        :param username:  本次客户端提交的用户信息,可以是user,也可以mobile或其他唯一字段
        :param password: 本次客户端提交的用户密码
        :param kwargs: 额外参数
        :return:
        """
        if username is None:
            username = kwargs.get(UserModel.USERNAME_FIELD)

        if username is None or password is None:
            return
        # 根据用户名信息useranme获取账户信息
        user = get_user_by_account(username)
        if user and user.check_password(password) and self.user_can_authenticate(user):
            return user

在配置文件settings/dev.py中告知Django使用我们自定义的认证后端,注意不是给drf添加设置。文章来源地址https://www.toymoban.com/news/detail-438330.html

# django自定义认证

AUTHENTICATION_BACKENDS = ['luffycityapi.utils.authenticate.CustomAuthBackend', ]

到了这里,关于drf重写authenticate方法实现多条件登录(源码分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包