DRF的认证组件(源码分析)

这篇具有很好参考价值的文章主要介绍了DRF的认证组件(源码分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

DRF认证组件(源码分析)

1. 数据库建立用户表

在drf中也给我们提供了 认证组件 ,帮助我们快速实现认证相关的功能,例如:

# models.py

from django.db import models

class UserInfo(models.Model):
    username = models.CharField(verbose_name="用户名", max_length=32)
    password = models.CharField(verbose_name="密码", max_length=64)
    token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True)

2. 自定义认证类

定义一个认证的类并继承BaseAuthentication

# -*- encoding:utf-8 -*-
# @time: 2023/4/21 8:44
# @author: ifeng

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed

from app01 import models


# 用户认证
class TokenAuthentication(BaseAuthentication):
    def authenticate(self, request):
        token = request.query_params.get('token')
        if not token:
            raise AuthenticationFailed({'code': 1002, 'error': '认证失败'})
        user_obj = models.UserInfo.objects.filter(token=token).first()
        if not user_obj:
            raise AuthenticationFailed({'code': 1001, 'error': '认证失败'})
        return user_obj, token

    def authenticate_header(self, request):
        return 'Bearer realm="API"'

3. 视图函数中添加认证

from rest_framework.response import Response
from rest_framework.views import APIView
from .auth import TokenAuthentication  # 导入认证类
from app01 import models


# Create your views here.


class UserView(APIView):
    authentication_classes = [TokenAuthentication, ]  # token认证

    def get(self, request, *args, **kwargs):
        # 用户认证
        print(request.user, request.auth)
        return Response({'code': 0, 'data': '嘻嘻嘻哈啊哈哈'})

    def post(self, request, *args, **kwargs):
        pass

4. 关于返回None

接下来说说 “返回None” 是咋回事。

在视图类的 authentication_classes 中定义认证类时,传入的是一个列表,支持定义多个认证类。

当出现多个认证类时,drf内部会按照列表的顺序,逐一执行认证类的 authenticate 方法,如果 返回元组 或 抛出异常 则会终止后续认证类的执行;如果返回None,则意味着继续执行后续的认证类。

如果所有的认证类authenticate都返回了None,则默认 request.user="AnonymousUser" 和 request.auth=None,也可以通过修改配置文件来修改默认值。

REST_FRAMEWORK = {
 "UNAUTHENTICATED_USER": lambda: None,
 "UNAUTHENTICATED_TOKEN": lambda: None,
}

应用场景:

当某个API,已认证 和 未认证 的用户都可以访问时,比如:

  • 已认证用户,访问API返回该用户的视频播放记录列表。
  • 未认证用户,访问API返回最新的的视频列表。

注意:不同于之前的案例,之前案例是:必须认证成功后才能访问,而此案例则是已认证和未认证均可访问。

5. 关于返回多个认证类

当项目中可能存在多种认证方式时,就可以写多个认证类。例如,项目认证支持:

  • 在请求中传递token进行验证。
  • 请求携带cookie进行验证。
class UserView(APIView):
    authentication_classes = [TokenAuthentication, CookieAuthentication]  # token认证

6. 全局配置

在每个视图类的类变量 authentication_classes 中可以定义,其实在配置文件中也可以进行全局配置,例如:

REST_FRAMEWORK = {
    # 认证
    "UNAUTHENTICATED_USER": lambda: None,  # 如果每一个认证最后都返回None. 就会调用到这个
    "UNAUTHENTICATED_TOKEN": lambda: None,
    'DEFAULT_AUTHENTICATION_CLASSES': ['app01.auth.TokenAuthentication', ]
}

7. 源码分析

序号为执行流程

DRF的认证组件(源码分析)文章来源地址https://www.toymoban.com/news/detail-420194.html

到了这里,关于DRF的认证组件(源码分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DRF JWT认证进阶

    (1)模型准备 模型准备(继承 django 的 auth_user 表) 添加配置文件,修改用户模型表为自定义表 (2)知识点绑定方法 详情请见:Python 面向对象之绑定和非绑定方法_python 绑定方法-CSDN博客 实例方法 当 对象调用 实例方法时( 对象.实例方法() ), 自动将对象当作第一个参数传

    2024年04月27日
    浏览(23)
  • Django DRF - 认证Authentication

    身份验证是将传入请求与一组标识凭据(例如,请求来自的用户或与其进行签名的令牌)相关联的机制。然后,权限和限制策略可以使用这些凭据来确定是否应允许该请求。 身份验证本身不会允许或不允许传入的请求,它只会标识发出请求的凭据。 认证管理一般和权限管理

    2023年04月12日
    浏览(35)
  • Django DRF - 【Token】认证基本使用

    Django Rest Framework Token 是Django Rest Framework中的一个扩展,用于实现用户认证和授权。它为每个用户生成一个唯一的Token,并将其存储在数据库中。在用户进行API请求时,用户需要在请求的HTTP Header中包含Token,这样服务器就可以验证用户的身份。 迁移完成会生成 authtoken_token 这张

    2024年02月12日
    浏览(34)
  • web应用模式、API接口、接口测试工具postman、如何在浏览器中测试、restful规范、序列化反序列化、基于Django原生编写五个接口、drf介绍和快速使用、drf之APIView源码分析

    目录 一、web应用模式 二、API接口 三、接口测试工具postman postman介绍 postman下载与使用 四、如何在浏览器中测试 五、restful规范(重要) 六、序列化反序列化 七、基于Django原生编写五个接口 八、drf介绍和快速使用 概念 特点(了解一下) 安装 使用drf编写五个接口 九、drf之API

    2024年02月05日
    浏览(57)
  • DRF的filter组件

    如果某个API需要传递一些条件进行搜索,其实就在是URL后面通过GET传参即可,例如: 在drf中filter组件可以支持条件搜索。 返回值: 在drf开发中有一个常用的第三方过滤器:DjangoFilterBackend。 注册app: 视图配置和应用: 视图配置和应用(示例3): lookup_expr 有很多常见选择:

    2023年04月23日
    浏览(32)
  • drf之day04: drf请求与响应,drf能够解析的请求编码,响应编码,drf之视图组件,2个视图基类

    一:drf之请求与响应 1.Request类 1.继承APIView后,请求对象requests每次请求都是一个新的request 2.data: POST, PUT, PATCH请求方式解析后的数据 3.原生django,put提交的数据在request.POST中是娶不到的 4.其他方法用起来和之前是一样的(method, FILES, path) 2.Response类 参数 功能 data=None 把字典,

    2023年04月12日
    浏览(81)
  • Django使用DRF + Simple JWT 完成小程序使用自定义用户的注册、登录和认证

    在已经配置好djangorestframework-simplejwt的前提下进行 小程序用户模型类 这里的模型类并未继承django自带的用户模型类,好处是后面小程序用户也是没法进行admin端的,缺点是可能会对django自带的权限管理有影响,如果只有小程序端的用户的话没问题,但是如果还有其它用户的话

    2024年02月10日
    浏览(46)
  • drf之频率类源码

    2024年02月07日
    浏览(20)
  • Django-drf项目初始化:跨域、认证权限过滤、static静态资源路由,mysql数据库连接,登录注册功能

    码云地址:https://gitee.com/liuhaizhang/drf-project-initialization 项目目录结构: study_drf            -home         -static         -study_drf         -util         -manage.py pip install django #drf基于django pip install djangorestframework #drf框架 pip install mysqlclient #连接数据库 pip install djangorestframewo

    2024年02月03日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包