脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - Django Rest Framework实现身份认证源码详解

Django Rest Framework实现身份认证源码详解

2023-02-09 11:21lemon * Python

这篇文章主要为大家介绍了Django Rest Framework实现身份认证源码详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

一.Django框架

Django确实是一个很强大,用起来很爽的一个框架,在Rest Framework中已经将身份认证全都封装好了,用的时候直接导入authentication.py这个模块就好了。这个模块中5个认证类。但是我们在开发中很少用自带的认证类,而是根据项目实际需要去自己实现认证类。下面是内置的认证类

BaseAuthentication(object):所有的认证相关的类都继承自这个类,我们写的认证类也要继承自这个认证类,类中面有两个方法,authenticate(self,request):这个方法是我们开发中用的最多的,还有一个方法:authentication_header(self,request):这个方法主要是给浏览器返回响应头的。

BasicAuthentication(BaseAuthentication):这个是基于浏览器实现的认证类。

SessionAuthentication(BaseAuthentication):使用Django的会话框架进行身份验证。

TokenAuthentication(BaseAuthentication):简单的基于令牌的身份验证。客户端应通过在“授权”中传递令牌密钥进行身份验证HTTP头,前面加上字符串“Token”

RemoteUserAuthentication(BaseAuthentication):远程用户身份验证。

Django Rest Framework实现身份认证源码详解

 

二.身份认证的两种实现方式:

1.第一种方式就是在views.py模块中去创建一个认证类,这个认证类必须重写authenticate()这个方法,这个方法必须返回一个元组,里面返回用户和token值,然后在需要认证的类视图中注册上这个认证类:

authentication_classes = [AuthClass,],authentication_classes

名字也不能改,后面讲源码的时候会告诉大家为什么这么写。这是第一种认证方式。

Django Rest Framework实现身份认证源码详解

2.①:第二中方式是在settings中配置认证模块,这种方式是全局身份认证。首先创建一个utils工具包,然后创建一个auth.py身份认证模块。把认证类写在这里面。这是开发中经常使用的方式,这样views.py中全是类视图,把认证类放到认证模块中,符合高内聚,低耦合的编程思想,也方便后期管理维护。

Django Rest Framework实现身份认证源码详解

②:然后将这个认证模块注册到settings.py中,这是全局认证,所有的类视图都会进行身份认证。

Django Rest Framework实现身份认证源码详解

③:用户登录的借口是不需要身份认证的,所以在用户登录接口中加上authentication_classes = [],这样登录接口就不会进行身份认证了。

Django Rest Framework实现身份认证源码详解

 

三.身份认证源码解析流程

1.首先当一个请求过来的时候,先走路由的as_view()方法,as_view()方法中调用了dispatch方法,rest framework 中的APIView(view)继承自django中的view,然后重写了dispatch()方法,于是走APIView中的dispatch()方法。

Django Rest Framework实现身份认证源码详解

2.重写的dispatch()对django的request进行了重新的封装,调用了initizlize_request()方法对request进行封装,我们进入initizlize_request()这个方法再看一下做了什么操作。

Django Rest Framework实现身份认证源码详解

3.initializer_request()这个方法中调用了get_authenticators()得到认证对象的这个方法,我们再进入这个方法看一下做了什么。

Django Rest Framework实现身份认证源码详解

4.进入get_authenticators()中发现,这个方法中有一个列表生成器,用来实例化当前认证类,这就是为什么之前要在类视图中注册认证类必须要用这个名字的原因,因为源码中规定了认证类读取的名字。

所以,如果我们自己写了认证类,他会在类视图中找到我们的认证类并执行返回,如果我们没有写认证类呢?会怎么执行?我们继续往下看,看看列表生成器中调中的authentication_classes这个属性它是从哪获得的。

Django Rest Framework实现身份认证源码详解

5.我们发现authentication_classes默认是从settings中配置获得的。所以这也是为啥可以把认证类配置在settings中的原因。

然后这就是initizlize_request()方法对request的认证封装的执行流程,封装完后在dispatch()中继续往下执行,当前只是实例化认证类,并没有执行认证。然后我们接着看dispatch()下面认证的执行流程

Django Rest Framework实现身份认证源码详解

6.dispatch()调用initial(request, *args, **kwargs)这个方法进行认证,我们看下initial(request, *args, **kwargs)这个方法做了什么。

Django Rest Framework实现身份认证源码详解

7.initial(request, *args, **kwargs)这个方法中又调用了三个方法:

perform_authentication(request):身份认证方法

check_permissions(request):权限验证方法

check_throttles(request):节流方法

我们看下perform_authentication(request):身份认证方法都干了些什么。

Django Rest Framework实现身份认证源码详解

8.perform_authentication(request):身份认证方法只调用了一个user方法,我们继续看user这个方法。

Django Rest Framework实现身份认证源码详解

9.user这个方法调用了_authenticate()这个方法,继续往下看。

Django Rest Framework实现身份认证源码详解

10.这次只终于到底了,_authenticate()方法中遍历认证类的所有对象,执行认证类的authenticate方法,这个就是我们写的身份认证方法,这个方法要返回一个元组,我们看下authenticate方法。

Django Rest Framework实现身份认证源码详解

11.authenticate()方法返回一个元组,元组中包含当前对象和token值,所以我们重写authenticate()方法也要返回这个元组。这样整个认证执行流程就全结束了。

如果authenitcate()方法抛出异常,就被捕获并执行 self._not_authenticated(),认证不通过并直接返回,就不会走dispatch()下面反射机制找视图函数方法了,反射机制上篇博客我详细的说过了,这里就不说了,如果没有抛出异常,继续走dispatch()下面的代码。

Django Rest Framework实现身份认证源码详解

以上就是Django Rest Framework实现身份认证源码详解的详细内容,更多关于Django Rest Framework身份认证的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/weixin_43697214/article/details/103386828

延伸 · 阅读

精彩推荐
  • Pythonpython assert的用处示例详解

    python assert的用处示例详解

    python assert 句语格式及用法很简单。通常程序在运行完之后抛出异常,使用assert可以在出现有异常的代码处直接终止运行。这篇文章通过实例代码介绍了p...

    周伯通的麦田10252021-06-10
  • PythonPython实现把数字转换成中文

    Python实现把数字转换成中文

    这篇文章主要介绍了Python实现把数字转换成中文,一般用于数字金额转中文大写金额,即将阿拉伯数字转换为大写的中文,需要的朋友可以参考下...

    Python教程网27172020-07-18
  • Pythonpython深度学习TensorFlow神经网络模型的保存和读取

    python深度学习TensorFlow神经网络模型的保存和读取

    这篇文章主要为大家介绍了python深度学习TensorFlow神经网络如何将训练得到的模型保存下来方便下次直接使用。为了让训练结果可以复用,需要将训练好的神...

    零尾10192022-02-24
  • Pythonpython xlsxwriter创建excel图表的方法

    python xlsxwriter创建excel图表的方法

    这篇文章主要为大家详细介绍了python xlsxwriter创建excel图表的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    CharliePeng12102021-03-03
  • Pythonpython抖音表白程序源代码

    python抖音表白程序源代码

    这篇文章主要为大家详细介绍了python抖音表白程序源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    black_hole67632021-06-13
  • Python几行Python代码爬取3000+上市公司的信息

    几行Python代码爬取3000+上市公司的信息

    今天小编就为大家分享一篇关于几行Python代码爬取3000+上市公司的信息,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起...

    Python新世界10472021-05-21
  • Pythonpandas merge报错的解决方案

    pandas merge报错的解决方案

    这篇文章主要介绍了pandas merge报错的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    一只勤奋爱思考的猪4792021-10-04
  • PythonPython字符串的创建和驻留机制详解

    Python字符串的创建和驻留机制详解

    字符串驻留是一种在内存中仅保存一份相同且不可变字符串的方法,本文重点给大家介绍Python字符串的创建和驻留机制,感兴趣的朋友跟随小编一起看看吧...

    向阳花木8762022-10-14