资讯专栏INFORMATION COLUMN

Django Rest Framework 认证功能-源码分析及使用技巧

20171112 / 2169人阅读

摘要:认证源码梳理从的开始入手观察源码在中,对原生进行了封装对原生的进行加工,包含原生丰富了获取原生的对象获取认证类对象认证认证跟进版本处理进行认证权限控制访问频率然后继续跟进,调用了方法获取认证对象进行一个一个认证,如果错误就触发异常认证方法这

</>复制代码

  1. pip3 install djangorestframework
认证源码梳理

从rest_framework的dispatch开始入手观察源码

在dispatch中,对原生request进行了封装

</>复制代码

  1. def dispatch(self, request, *args, **kwargs):
  2. self.args = args
  3. self.kwargs = kwargs
  4. # 对原生的request进行加工,包含【原生request】丰富了authenticator
  5. request = self.initialize_request(request, *args, **kwargs)
  6. # 获取原生的request对象 request._request
  7. # 获取认证类对象 request.authenticators
  8. self.request = request
  9. self.headers = self.default_response_headers # deprecate?
  10. try:
  11. # 2. 认证
  12. self.initial(request, *args, **kwargs)
  13. .....

认证

跟进self.initial

</>复制代码

  1. def initial(self, request, *args, **kwargs):
  2. self.format_kwarg = self.get_format_suffix(**kwargs)
  3. """版本处理"""
  4. neg = self.perform_content_negotiation(request)
  5. request.accepted_renderer, request.accepted_media_type = neg
  6. ......
  7. """进行认证"""
  8. self.perform_authentication(request)
  9. """权限控制"""
  10. self.check_permissions(request)
  11. """访问频率"""
  12. self.check_throttles(request)

</>复制代码

  1. 然后继续跟进,调用了.user._authenticate()方法 # 获取认证对象进行一个一个认证,如果错误就触发异常!
认证方法

</>复制代码

  1. 这是认证和视图写在了一起,方便观看,实际中最好将认证类多带带存放在一个py中

</>复制代码

  1. from rest_framework.views import APIView
  2. from rest_framework import exceptions
  3. from rest_framework.authentication import BaseAuthentication # 内置的认证类【必须继承】
  4. class Authentication(BaseAuthentication): # 自己写认证,然后引用
  5. def authenticate(self, request):
  6. token = request._request.GET.get("token")
  7. token_obj = models.UserToken.objects.filter(token=token).first()
  8. if not token_obj:
  9. # 其实在内部捕捉了异常
  10. raise exceptions.AuthenticationFailed("用户认证失败")
  11. # 返回user对象 + token
  12. # 在rest framework 内部会将两个字段赋值给 request,给后面调用
  13. """返回值必须是元祖 第一个赋值给 request.user 第二个request.auth"""
  14. return (token_obj.user, token_obj)
  15. def authenticate_header(self, request):
  16. pass
  17. ...
  18. class DogView(APIView):
  19. """
  20. 应用上Authentication认证规则。如果有多个,那么依次认证
  21. 如果都没有认证,那么默认值 request.user=AnonymousUser request.auth = None 匿名用户
  22. request.user 这是token_obj.user 源码中规定元祖第一个
  23. request.auth 这是token_obj 源码中规定元祖第二个
  24. """
  25. authentication_classes = [Authentication, ]
  26. ......
源码流程图

setting中配置认证类

</>复制代码

  1. 实际中将自己写的认证方法多带带放在一个py中,然后在项目setting中配置即可

</>复制代码

  1. # 导入自己写的rest 认证路径
  2. """
  3. 可以局部使用或者全局使用
  4. 局部: authentication_classes = []
  5. """
  6. REST_FRAMEWORK = {
  7. "DEFAULT_AUTHENTICATION_CLASSES": ["app01.utils.auth.Authentication", ], # 全局使用的认证类,也可以局部使用
  8. "UNAUTHENTICATED_USER": None, # 匿名用户, request.user = None
  9. "UNAUTHENTICATED_TOKEN": None, # 匿名用户, request.auth = None
  10. }

这样写的好处是无需再视图中再写引用了,会自动按照你setting中的配置进行认证,如果指定视图不需要认证,那么在该view中写 authentication_classes = [] 即可

内置的认证

BaseAuthentication 主要使用的就是这个

BasicAuthentication 浏览器内置的认证【大家了解下就是了】

剩下的就是基于django的用户认证了


使用总结

创建类: 继承BaseAuthentication - 实现 authenticate方法

返回值 结果
None 执行下一个认证
raise 认证失败抛出异常
元祖(元素1,元素2) 元素1=request.user; 元素2=request.auth

全局使用

</>复制代码

  1. setting中配置,然后在多带带的py文件中写入认证「写入路径」

局部使用

</>复制代码

  1. 在视图中 引入authentication_classes = [认证类, ]

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43159.html

相关文章

  • django rest framework个人学习笔记(六)————Tutorial4.认证于授权

    摘要:另外一个字段用于储存突出显示的代码的表示形式。这将确保认证用户拥有读写权限,而未认证用户只有读的权限。唯一的限制是必须是。 官网地址目前,我们的API没有对如 edit 或者 delect做出任何限制。我们希望有一些更加高级的功能能够做到: Code snippets 应该永远和创建者相关 只有认证的用户才能够创建snippets 只有创建者才能更新或者删除他的snippet 没有认...

    eternalshallow 评论0 收藏0
  • django rest framework个人学习笔记(六)————Tutorial4.认证于授权

    摘要:另外一个字段用于储存突出显示的代码的表示形式。这将确保认证用户拥有读写权限,而未认证用户只有读的权限。唯一的限制是必须是。 官网地址目前,我们的API没有对如 edit 或者 delect做出任何限制。我们希望有一些更加高级的功能能够做到: Code snippets 应该永远和创建者相关 只有认证的用户才能够创建snippets 只有创建者才能更新或者删除他的snippet 没有认...

    MonoLog 评论0 收藏0
  • django rest framework个人学习笔记(六)————Tutorial4.认证于授权

    摘要:另外一个字段用于储存突出显示的代码的表示形式。这将确保认证用户拥有读写权限,而未认证用户只有读的权限。唯一的限制是必须是。 官网地址目前,我们的API没有对如 edit 或者 delect做出任何限制。我们希望有一些更加高级的功能能够做到: Code snippets 应该永远和创建者相关 只有认证的用户才能够创建snippets 只有创建者才能更新或者删除他的snippet 没有认...

    caozhijian 评论0 收藏0
  • django rest framework个人学习笔记(一)————Install

    摘要:本文主要是用来记录自己学习的过程。其中可能会有很多自己的错误理解。这里主要会用到的知识有百度百科阮一峰理解架构其余请自行百度。所有的全局设置都放在的字典中。使用标准的权限,未认证的用户只读权限不要忘记将添加到你的中。 本文主要是用来记录自己学习django-rest-framework的过程。其中可能会有很多自己的错误理解。 这里主要会用到的知识有 1. [django](https:...

    yuxue 评论0 收藏0
  • django rest framework个人学习笔记(一)————Install

    摘要:本文主要是用来记录自己学习的过程。其中可能会有很多自己的错误理解。这里主要会用到的知识有百度百科阮一峰理解架构其余请自行百度。所有的全局设置都放在的字典中。使用标准的权限,未认证的用户只读权限不要忘记将添加到你的中。 本文主要是用来记录自己学习django-rest-framework的过程。其中可能会有很多自己的错误理解。 这里主要会用到的知识有 1. [django](https:...

    yagami 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<