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. netty集群(一)-服务注册发现

    上篇文章介绍了如何搭建一个单机版本的netty聊天室:https://www.jianshu.com/p/f786c70eeccc. 一.需要解决什么问题: 当连接数超过单机的极限时,需要将netty ...

  2. Windows下C,C++开发环境搭建指南

    Windows下C,C++开发环境搭建指南 前情提要 基于近一段时间很多网友发邮件反馈,说一些项目编译出现问题,诸如此类的情况. 就觉得很有必要写一篇C,C++开发环境的小指南,统一回复. 1.君欲善 ...

  3. [noi.ac省选模拟赛]第10场题解集合

    题目 比赛界面. T1 不难想到,对于一个与\(k\)根棍子连接的轨道,我们可以将它拆分成\(k+1\)个点,表示这条轨道不同的\(k+1\)段. 那么,棍子就成为了点与点之间的边.可以发现,按照棍子 ...

  4. @bzoj - 1921@ [ctsc2010]珠宝商

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 简述版题意:给定字符串 S 与一棵树 T,树上每个点有一个字符. ...

  5. Install Centos7 on VirtualBox in mac

    Step 1:准备虚拟机及镜像 下载合适的Virtual Box版本 官方下载链接:https://www.virtualbox.org/wiki/Downloads 这里选择的版本是:https:/ ...

  6. Redis Wendows安装步骤

    1.打开cmd命令提示符2.打开cmd如下图,输入Redis下载磁盘名称+“:” ,然后回车 3.如下图:输入"cd" 然后空格,后面是Redis的路径   回车 4.设置服务命令 ...

  7. Spring:一、基本模块思维导图

  8. C# 9.0 终于来了, Top-level programs 和 Partial Methods 两大新特性探究

    一:背景 1. 讲故事 .NET 5 终于在 6月25日 发布了第六个预览版,随之而来的是更多的新特性加入到了 C# 9 Preview 中,这个系列也可以继续往下写了,废话不多说,今天来看一下 To ...

  9. Docker入门(1):概述

    1.摘要 在这篇文章中,我将介绍一下为什么需要虚拟化的环境. 然后我将介绍耳熟能详的虚拟化技术:虚拟机,并大致的介绍一下虚拟机的原理,希望能够让你知道虚拟机的优劣. 在之后,针对虚拟机存在的问题,引出 ...

  10. Python实用笔记 (23)面向对象高级编程——使用__slots__

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pa ...