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. grafana repeat 特性

    1.设置变量 成功后会自动复制变量值个数的的画图板 类似下图 设置后是不能与预览结果的,需要保存后 切换到其他dashboard 再切换回来就可以看见了 官方文档repeat说明

  2. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(五)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  3. 解决:gradle 前言中不允许有内容

    将Android Studio 升级到4.0然后创建一个新项目,编译出现“ gradle 前言中不允许有内容” 的错误,在网上找了很多资料,众说纷纭,但都没有解决我的问题,最后反复摸索把问题解决了. ...

  4. Astah类图中使用list<>

    如何在类图中表示如下的属性,这个问题困扰了我好久.之前百度找不着任何相关的内容,今天终于在其官方论坛找着了答案. class cMeterRecord { protected: cMeterStatu ...

  5. 使用JFreeChart生成条形图

    1. 准备工作 下载JFreeChart,我使用的版本为1.0.19,相关内容参见JFreeChart,下载链接为https://sourceforge.net/projects/jfreechart ...

  6. 私有云nextcloud、seafile、syncthing的比较

    可选 nextcloud.seafile.syncthing 1. seafile https://www.jianshu.com/p/43f570118e63 https://www.jianshu ...

  7. log报错的原因解决

    idea未装lombok的插件: 1.用快捷键Ctrl+Alt+S打开:Settings→Plugins→Browse repositories 2.输入lom后选择Install,安装插件 3.按照 ...

  8. Java8新特性之流stream

    <Java 8 实战>学习笔记系列 定义 流是Java API的新成员,它允许你以声明性方式处理数据集合,可以把它看成遍历数据集的高级迭代器 示例 List<String> t ...

  9. 使用numpy生成二维正态分布

    参考资料: https://www.zhihu.com/question/39823283?sort=created https://www.zhihu.com/question/288946037/ ...

  10. Wireshark论证TCP3次握手的过程

    wireshark过滤条件:ip.addr == 120.79.36.180 千万别写成 ip.dst == 120.79.36.180 ,这样子就看不到服务器给我们返回的包了 此时,在浏览器输入12 ...