drf –用户认证组件Authentication

认证组件Authentication的配置方式一

在配置文件中配置全局认证方案

  • 首先可以在目录 /rest_framework/settings.py 下,找到认证组件配置
  • 然后将配置信息,添加到项目主应用的settings.py中,但是这样是全局配置
  • 示例代码
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',  # session认证
        'rest_framework.authentication.BasicAuthentication',    # 基本认证
          #当然这儿也可以写自己定义好的类
          #因为全局配置太过于粗暴,如果某些视图函数不需要权限认证的话,可以加上一个 authentication_classes = [ ] 等于一个空列表
    )
}

认证组件Authentication的配置方式二

在每个视图类中,通过设置authentication_classess类属性来设置

示例代码:

from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView

class ExampleView(APIView):
    # 类属性
    authentication_classes = [SessionAuthentication, BasicAuthentication]
    def get(self,request):
        pass

认证结果

认证失败会有两种可能的返回值,这个需要我们配合权限组件来使用:

  • 401 Unauthorized 未认证
  • 403 Permission Denied 权限被禁止

三、自定义认证逻辑,以及自定义认证失败的错误信息

  • 首先,我们可以自己定义一个认证组件,来继承drf写好的认证组件类:BaseAuthentication
  • 重写 BaseAuthentication 类的 authenticate()方法,来实现具体的逻辑,以及重新
  • authenticate()方法在认证失败时,可以通过 drf的认证失败类AuthenticationFailed,来自定义抛出的错误信息
  • authenticate()方法认证成功时,返回一个元祖,元祖的第一个元素赋值给request.user,元祖第二个元素赋值给request.auth,因此,我们在编写逻辑的时候,要注意返回的值给放对位置

示例代码:

#认证组件示例代码:

from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from student.models import Student

class Auth(BaseAuthentication):

    def authenticate(self, request):
        token = request.query_params.get('token')
        if not token:
            raise AuthenticationFailed({"code": 1000, "data": "认证失败"})
        user_obj = Student.objects.filter(token=token).filter()
        if not user_obj:
            # if token != request.user.token:
            raise AuthenticationFailed({"code": 1000, "data": "认证失败"})
        else:
            # return request.user,token
            return user_obj, token

    def authenticate_header(self, request):
        pass

##视图函数POST写法
#POST为登录方法,不用认证,只需要验证用户名和密码
    def post(self,request,*args,**kwargs):
        username= request.data.get('username')
        password = request.data.get('password')

        user_obj = Student.objects.filter(username=username,password=password).first()
        if not user_obj:
            return Response({"code":1000,'data':"用户名或密码错误"})
        token = str(uuid.uuid4())
        user_obj.token = token
        user_obj.save()
        return Response({"code":0,"data":{"touck":token,"name":username}})

##视图函数GET方法
class StudentViewSet(APIView):
    #这个类属性,加上自定义好的认证类
    authentication_classes = [Auth, ]

        def get(self, request, *args, **kwargs):
        print(request.user)
        print(request.auth)
        return Response("ok")

最后,需注意,认证类的 authenticate()方法的 3种返回值:

  • 返回 None ,表示如果存在多个认证类,返回None可以执行下一个认证类
  • 返回 (None,None) ,表示该认证类不生效,也就是不执行该认证类的效果
  • 返回 (user,auth),表示在当前认证类完成后,如果后面还有认证类,也不会继续认证了

Original: https://www.cnblogs.com/zhiqianggege/p/16221734.html
Author: 志强爱璇璇
Title: drf –用户认证组件Authentication

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/596288/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Scrapy 框架架构

    Scrapy 框架架构 目录 Scrapy 框架架构 前言 一、核心组成 二、数据流 三、项目结构 总结 前言 Scrapy (/ˈskreɪpaɪ/) 是一个用于抓取网站和提取结…

    Python 2023年10月1日
    027
  • 除了Matplotlib,Python还有这些可视化工具(一)

    ; 一、Matplotlib(python原生绘图库) 官方网站及文档:https://matplotlib.org/以下是基本示例,官方还有 大量的其他示例代码。链接:https…

    Python 2023年9月6日
    0108
  • windows10环境下安装django与apache记录

    django3.2 mod_wsgi python3.7 windows10 apache2.4 mysql8.0 下载并安装apache 安装mysql 常规安装即可 安装pyt…

    Python 2023年8月4日
    080
  • django+vue兼容

    安装node Node.js 安装v14.17.1版本 安装vue-cli 运行命令安装vue-cli 3.12.1 sudo npm install -g @vue/cli@3….

    Python 2023年8月5日
    032
  • wireshark一开,无线网络就断开

    最近在研究wireshark 笔记本连着wifi,开始抓包后,无线网就断了 查了半天,需要把捕获–>选项里的监控模式去掉就行了 Original: https:/…

    Python 2023年6月3日
    079
  • 如何选择合适的后端

    我的新书 《Android App开发入门与实战》 已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 文章目录 1. 什么是后端? 2. Node.js * 何时使用…

    Python 2023年8月3日
    072
  • 20行Python代码实现爬取起点小说

    import requests # 发送请求 import re 伪装 headers = { ‘cookie’: ‘_yep_uuid=b1421b7f-11da-b15f-a3…

    Python 2023年11月3日
    038
  • 深度学习炼丹-不平衡样本的处理

    前言 一,数据层面处理方法 1.1,数据扩充 1.2,数据(重)采样 数据采样方法总结 1.3,类别平衡采样 二,算法(损失函数)层面处理方法 2.1,Focal Loss 2.2…

    Python 2023年10月13日
    049
  • pytest-xdist并发执行

    pytest-xdist这款插件允许用户将测试并发执行(进程级并发). pytest-xdist工作原则:用例之间没有依赖关系,用例可以完全独立运行 pytest-xdist工作原…

    Python 2023年9月11日
    048
  • 带你了解NLP的词嵌入

    摘要:今天带领大家学习自然语言处理中的词嵌入的内容。 本文分享自华为云社区《【MindSpore易点通】深度学习系列-词嵌入》,作者:Skytier。 1 特征表示 在自然语言处理…

    Python 2023年10月28日
    041
  • 解决Mac更新安装zsh后出现Python虚拟环境的问题

    如果您每次打开终端时都会得到提示: [En] If you are prompted every time you open the terminal: The default i…

    Python 2023年5月25日
    091
  • Python网络爬虫笔记11:Scrapy的使用

    1 安装scrapy 安装命令: pip install scrapy 安装完成后,在控制台输入命令 scrapy bench;不报错则表示安装成功。 windows下安装时,可能…

    Python 2023年10月5日
    039
  • 列表与元组

    列表(list) 列表(list)是包含0个或多个元素的有序序列 创建列表的方式:将逗号分隔的不同元素使用方括号括起来即可 listname=[‘name’,’id’,’card’…

    Python 2023年6月12日
    0100
  • Python中进行串口操作

    环境 python 3.8 pyserial 3.5 前言 串口使用是做嵌入式系统开发的必备技能,一般都会使用诸如 securecrt、 putty 这样的工具来发送和接收数据。本…

    Python 2023年8月1日
    055
  • python pandas 增加一列_在Python pandas中向现有数据框架添加新列

    匿名用户 我想在现有数据帧中添加一个新列’e’,并且不要更改数据帧中的任何内容。(序列的长度始终与数据帧相同。) 我假设中的索引值与中的索引值匹配。 启动名…

    Python 2023年8月7日
    048
  • 【温故知新】pytest框架执行用例并打印日志和报告

    准备测试框架: python3 + pytest + allure Allure作用:灵活轻便兼容性强大的报告输出插件,由Java语言开发,可以集成到 Jenkin,支持多语言。 …

    Python 2023年9月9日
    049
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球