django 认证类配置实现


Posted in Python onNovember 11, 2021

一、配置认证类

1.认证全局配置文件

经过认证的源码流程剖析,DRF的认证全局配置在api_setting中,以下是api_setings部分源码:

api_settings = APISettings(None, DEFAULTS, IMPORT_STRINGS)

def reload_api_settings(*args, **kwargs):
    setting = kwargs['setting']
    if setting == 'REST_FRAMEWORK':  #项目中settings.py的key
        api_settings.reload()

setting_changed.connect(reload_api_settings)

其中引用了django,settings.py中的REST_FRAMEWORK作为key作为配置,所以全局配置示例:

#全局认证配置
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',]   #其中写认证的类的路径,不要在views中,这里我放在了utils目录下auth.py中
}

2.局部使用

局部某个视图不需要认证,则在视图类中加入authentication_classes=[]

authentication_classes = []    #authentication_classes为空,代表不需要认证

3.匿名用户配置:

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',],  #其中写认证的类的路径,不要在views中,这里我放在了utils目录下auth.py中    "UNAUTHENTICATED_USER": lambda:"匿名",#匿名用户配置,只需要函数或类的对应的返回值,对应request.user="匿名"
"UNAUTHENTICATED_token": None,#匿名token,只需要函数或类的对应的返回值,对应request.auth=None
}

二、内置认证类

1.BaseAuthentication

BaseAuthentication是django rest framework为我们提供了最基本的认证类,正如源码流程一样,该类中其中定义的两个方法authenticate和authenticate_header(认证失败返回的响应头),使用时候重写该两个方法进行认证,正如示例:

class BaseAuthentication(object):
    """
    All authentication classes should extend BaseAuthentication.
    """def authenticate(self, request):
        """
        Authenticate the request and return a two-tuple of (user, token).
        """raise NotImplementedError(".authenticate() must be overridden.")

    def authenticate_header(self, request):
        """
        Return a string to be used as the value of the `WWW-Authenticate`
        header in a `401 Unauthenticated` response, or `None` if the
        authentication scheme should return `403 Permission Denied` responses.
        """pass

2.其他认证类

##路径:rest_framework.authentication
BasicAuthentication  #基于浏览器进行认证
SessionAuthentication #基于django的session进行认证
RemoteUserAuthentication #基于django admin中的用户进行认证,这也是官网的示例
TokenAuthentication #基于drf内部的token认证

三、总结

1.自定义认证类:

继承BaseAuthentication,重写authenticate方法和authenticate_header(pass就可以),authenticate()方法需要有三种情况(返回元祖、出现异常、返回none)。

2.认证配置:

#全局认证
REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES":['API.utils.auth.Authentication',]
}

#局部认证
authentication_classes = [BaseAuthentication,]

#是某个视图不进行认证
authentication_classes =[]

3.源码流程:

1.在django(CBV)中,客户端的发来的请求会执行视图类的as_view方法,而as_view方法中会执行dispacth方法,然后在根据请求的类型(反射)执行相应的方法(get、post等)。

2.使用django rest framework中的视图类需要继承APIView,请求到达视图类会执行视图类的as_view方法,而OrderView中没有as_view()方法,所以执行APIView的as_view()方法,

3.从APIView源码中可以看到APIView中as_view又执行了父类的as_view方法,在看看APIView的父类是View类,这恰好是django中的view视图类,

4.从View源码可以看出View类的as_view()方法执行流程:验证请求方法--->返回view函数名称(view函数会执行dispatch方法),一旦有请求进来执行view函数-->执行dispatch方法

5.当APIView的as_view方法执行了父类的as_view方法以后,请求进来会执行view方法,view方法中会执行dispatch方法,而Oderview没有dispatch方法,所以执行父类(APIView)的dispatch方法,

6.从APIView源码分析,执行APIView的dispatch方法时候会执行self.initialize_request方法,会对django原始的request进行封装。

7.self.initialize_request()源码分析,实例化Request()类,封装原始的request,authenticators(认证),执行self.get_authenticators(),到了这里就开始django rest framework的认证流程

8.self.get_authenticators()源码分析,采用列表生成式,循环self.authentication_classes,实例化其中的每一个类,返回列表,不难发现authentication_classes属性正式我们在认证的时候用到认证类列表,这里会自动寻找该属性进行认证。倘若我们的视图类没有定义认证方法呢?,当然django rest framework 已经给我们加了默认配置,如果我们没有定义会自动使用settings中的DEFAULT_AUTHENTICATION_CLASSES作为默认(全局),

 9.继续分析APIView的dispatch方法,此时执行self.inital方法,并将封装过后的request对象(Reuqest)作为参数进行传递,

10.在self.inital方法中会执行self.perform_authentication方法,而self.perform_authentication方法用会执行request.user,此时的request是Request对象,所以需分析Request类中的user属性,

11.从源码分析,在Request对象中,user属性是一个属性方法,并会执行self._authentication方法,

12.从源码分析,Request对象的self._authentication中循环self.authenticators(该列表是由认证对象构成的[对象1,对象2]),并执行每一个对象中的authenticate方法返回tuple,同时对该过程其进行了异常捕捉,有异常将返回给用户,下面是异常验证逻辑:

如果有异常则执行self._not_authenticated()方法,继续向上抛异常。
如果有返回值必须是一个元组,分别赋值给self.user, self.auth(request.user和request.auth),并跳出循环。
如果返回None,则由下一个循环处理,如果都为None,则执行self._not_authenticated(),返回 (AnonymousUser,None)
13.当都没有返回值,就执行self._not_authenticated(),相当于匿名用户,没有通过认证,并且此时django会返回默认的匿名用户设置AnonymousUser,如需要单独设置匿名用户返回值,则编写需要写UNAUTHENTICATED_USER的返回值:

14.所以经过以上分析,我们需要进行认证时候,需要在每一个认证类中定义authenticate进行验证,并且需要返回元祖。

到此这篇关于django 认证类配置实现的文章就介绍到这了,更多相关django 认证类配置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python程序中的观察者模式结构编写示例
May 27 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
使用PyV8在Python爬虫中执行js代码
Feb 16 Python
使用Turtle画正螺旋线的方法
Sep 22 Python
python线程池(threadpool)模块使用笔记详解
Nov 17 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
python 基于dlib库的人脸检测的实现
Nov 08 Python
win10从零安装配置pytorch全过程图文详解
May 08 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
Pandas对每个分组应用apply函数的实现
Dec 13 Python
AI:如何训练机器学习的模型
Apr 16 Python
Python网络编程之ZeroMQ知识总结
Apr 25 Python
Python Pandas数据分析之iloc和loc的用法详解
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
python中tkinter复选框使用操作
Nov 11 #Python
Python中的变量与常量
Nov 11 #Python
Python 键盘事件详解
Nov 11 #Python
Python 详解通过Scrapy框架实现爬取CSDN全站热榜标题热词流程
Nov 11 #Python
You might like
基于在生产环境中使用php性能测试工具xhprof的详解
2013/06/03 PHP
php正则判断是否为合法身份证号的方法
2017/03/16 PHP
使用IE的地址栏来辅助调试Web页脚本
2007/03/08 Javascript
JS 时间显示效果代码
2009/08/23 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
AngularJS中重新加载当前路由页面的方法
2018/03/09 Javascript
jQuery实现验证用户登录
2019/12/10 jQuery
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
python调用cmd命令行制作刷博器
2014/01/13 Python
Python判断操作系统类型代码分享
2014/11/22 Python
Python最基本的数据类型以及对元组的介绍
2015/04/14 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python3实现ftp服务功能(服务端 For Linux)
2017/03/24 Python
详解Django中间件执行顺序
2018/07/16 Python
pip安装python库的方法总结
2019/08/02 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
linux 下selenium chrome使用详解
2020/04/02 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
Django日志及中间件模块应用案例
2020/09/10 Python
python判断all函数输出结果是否为true的方法
2020/12/03 Python
你们项目是如何进行变更控制的
2015/08/26 面试题
幼儿教师师德承诺书
2014/05/23 职场文书
学校节能减排方案
2014/06/13 职场文书
自愿解除劳动合同协议书
2014/09/11 职场文书
党支部季度考核意见
2015/06/02 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python
使用JS实现简易计算器
2021/06/14 Javascript
Python max函数中key的用法及原理解析
2021/06/26 Python
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS