05 drf源码剖析之认证

1. 认证简述

  • 当我们通过Web浏览器与API进行交互时,我们可以登录,然后浏览器会话将为请求提供所需的身份验证。

  • 如果我们以编程方式与API进行交互,则需要在每个请求上显式提供身份验证凭据。

  • 如果我们尝试在不进行身份验证的情况下创建代码段,则会收到错误消息

2. 认证的使用

  • 创建一个认证类MyAuthentication

    class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
    """
    Authenticate the request and return a two-tuple of (user, token).
    """
    token = request.query_params.get('token')
    user_object = models.UserInfo.objects.filter(token=token).first()
    if user_object:
    return (user_object,token)
    return (None,None) # 最好继承Base类有一个约束
  • 在需要认证的类添加authentication_classes

    class OrderView(APIView):
    authentication_classes = [MyAuthentication, ]
    def get(self,request,*args,**kwargs):
    print(request.user)
    print(request.auth)
    return Response('order') class UserView(APIView):
    authentication_classes = [MyAuthentication,]
    def get(self,request,*args,**kwargs):
    print(request.user)
    print(request.auth)
    return Response('user')
  • 全局使用配置,修改匿名用户的名称

    REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES":["utils.auth.GeneralAuthentication",], # 在全局使用认证类,列表里边写认证类的路径,不需要在类内部定义类
    "UNAUTHENTICATED_USER":None, # 修改匿名用户的昵称
    "UNAUTHENTICATED_TOKEN":None
    }

3. 源码剖析

  • 请求过来先执行dispatch方法

    def dispatch(self, request, *args, **kwargs):
    """
    - 内部封装了 authenticators = [MyAuthentication(), ]
    """
    request = self.initialize_request(request, *args, **kwargs)
  • 执行initialize_request方法,将认证对象列表封装到新的request对象中

    def initialize_request(self, request, *args, **kwargs):
    parser_context = self.get_parser_context(request) return Request(
    request,
    parsers=self.get_parsers(),
    authenticators=self.get_authenticators(), # [MyAuthentication(),]
    negotiator=self.get_content_negotiator(),
    parser_context=parser_context
    )
  • 执行get_authenticators方法,将认证类实例化成对象放到认证列表中

    def get_authenticators(self):
    return [ auth() for auth in self.authentication_classes ]
  • 认证时会执行Request对象的user方法

    class Request:
    
        def __init__(self, request,authenticators=None):
    self._request = request
    self.authenticators = authenticators or () @property
    def user(self):
    if not hasattr(self, '_user'):
    with wrap_attributeerrors():
    self._authenticate()
    return self._user
  • _authenticate方法会执行每个认证类的authenticate方法

    def _authenticate(self):
    for authenticator in self.authenticators:
    try:
    user_auth_tuple = authenticator.authenticate(self)
    except exceptions.APIException:
    self._not_authenticated()
    raise if user_auth_tuple is not None:
    self._authenticator = authenticator
    self.user, self.auth = user_auth_tuple
    return self._not_authenticated()
  • 认证成功后,将用户对象赋值给request.user

    @user.setter
    def user(self, value):
    self._user = value
    self._request.user = value

4. 总结

  1. 当用户请求过来时,执行dispatch,通过initialize_request方法,
  2. 找到认证的所有类并实例化成对象列表,然后将对象列表封装到新的request对象中。
  3. 执行下面的initial方法,经过认证的request.user方法
  4. 在内部会循环认证的对象列表,并执行每个对象的authenticate方法,该方法用于认证,返回值有三种,①抛出异常②返回None③返回一个元组
  5. 返回元组的两个值分别赋值给request.user和request.auth

05 drf源码剖析之认证的更多相关文章

  1. drf源码剖析系列(系列目录)

    drf源码剖析系列(系列目录) 01 drf源码剖析之restful规范 02 drf源码剖析之快速了解drf 03 drf源码剖析之视图 04 drf源码剖析之版本 05 drf源码剖析之认证 06 ...

  2. 07 drf源码剖析之节流

    07 drf源码剖析之节流 目录 07 drf源码剖析之节流 1. 节流简述 2. 节流使用 3. 源码剖析 总结: 1. 节流简述 节流类似于权限,它确定是否应授权请求.节流指示临时状态,并用于控制 ...

  3. 06 drf源码剖析之权限

    06 drf源码剖析之权限 目录 06 drf源码剖析之权限 1. 权限简述 2. 权限使用 3.源码剖析 4. 总结 1. 权限简述 权限与身份验证和限制一起,决定了是否应授予请求访问权限. 权限检 ...

  4. 04 drf源码剖析之版本

    04 drf源码剖析之版本 目录 04 drf源码剖析之版本 1. 版本简述 2. 版本使用 3.源码剖析 4. 总结 1. 版本简述 API版本控制使您可以更改不同客户端之间的行为.REST框架提供 ...

  5. 02 drf源码剖析之快速了解drf

    02 drf源码剖析之快速了解drf 目录 02 drf源码剖析之快速了解drf 1. 什么是drf 2. 安装 3. 使用 3. DRF的应用场景 1. 什么是drf drf是一个基于django开 ...

  6. 05 flask源码剖析之配置加载

    05 Flask源码之:配置加载 目录 05 Flask源码之:配置加载 1.加载配置文件 2.app.config源码分析 3.from_object源码分析 4. 总结 1.加载配置文件 from ...

  7. Django Rest Framework源码剖析(一)-----认证

    一.简介 Django REST Framework(简称DRF),是一个用于构建Web API的强大且灵活的工具包. 先说说REST:REST是一种Web API设计标准,是目前比较成熟的一套互联网 ...

  8. drf源码分析系列---认证

    认证的使用 from rest_framework.authentication import BaseAuthentication from api import models # 认证类 clas ...

  9. 01 drf源码剖析之restful规范

    01 restful规范 目录 01 restful规范 1. 什么是restful规范 2.restful规范详细 1. 什么是restful规范 restful是一套规则,是程序间进行数据传输的一 ...

随机推荐

  1. 大数据之Hudi + Kylin的准实时数仓实现

    问题导读:1.数据库.数据仓库如何理解?2.数据湖有什么用途?解决什么问题?3.数据仓库的加载链路如何实现?4.Hudi新一代数据湖项目有什么优势? 在近期的 Apache Kylin × Apach ...

  2. 怎样在LaTeX中使用中文

    因为疫情在家中上课,作业提交都必须使用PDF.反正时间充裕,不如趁机回顾一下LaTeX的使用. 之前一直用的是Vimtex,但是感觉还是不太方便,于是改用了Texpad.Texpad的强大之处在于它支 ...

  3. Dubbo——服务调用过程

    文章目录 引言 服务的交互 服务降级 集群容错 服务调用 服务端接收请求 总结 引言 经过之前文章的铺垫,现在可以来分析服务的交互调用过程了. 服务的交互 服务降级 从名字上看我们不难理解MockCl ...

  4. SpringBoot + Mybatis + Redis 整合入门项目

    这篇文章我决定一改以往的风格,以幽默风趣的故事博文来介绍如何整合 SpringBoot.Mybatis.Redis. 很久很久以前,森林里有一只可爱的小青蛙,他迈着沉重的步伐走向了找工作的道路,结果发 ...

  5. django 网站域名解析 IP绑定 新建站 新域名

    备案成功后,我们要用域名来访问服务器,这个不仅要修改nginx的配置文件,还要设置域名的解析,下面是我的一个调试经验过程:直接上图了. 1.问题查找

  6. 010.OpenShift综合实验及应用

    实验一 安装OpenShift 1.1 前置准备 [student@workstation ~]$ lab review-install setup 1.2 配置规划 OpenShift集群有三个节点 ...

  7. 处理TortoiseGit一直弹出密码框的方法 -输入git@XXXX.com的密码

    问题 :在push和pull的时候,一直都弹出这个框 1.开始处搜索TortoiseGit文件夹,找到其中的“PuTTYgen”文件,如下显示 2.运行之后在弹出的窗口中点击下方的“Generate” ...

  8. 02.Hamcrest和TestSuite介绍

    1.首先第一步需要导入对应的jar包 我们来看下面的一个例子 OK,在前面的一系列博客里面,我整理过了Assert类下面常用的断言方法,比如assertEquals等等,但是org.junit.Ass ...

  9. 使用spring-test时报错

    java.lang.NoClassDefFoundError: org/springframework/core/annotation/MergedAnnotations$SearchStrategy ...

  10. C#数据结构与算法系列(十四):递归——八皇后问题(回溯算法)

    1.介绍 八皇后问题,是一个古老而著名的问题,是回溯算法的经典案例,该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即 任意两个皇后都不能处 ...