Django REST Framework(DRF)框架之认证Authentication与权限Permission

news2024/10/6 14:36:48

DRF框架之认证与权限

  • 认证与权限
    • 认证(Authentication)
    • 权限(Permission)
  • 认证和权限的使用
    • 创建用户用于验证
    • 配置认证与权限(全局)
    • 视图指定认证与权限(局部)
  • 自定义权限
    • 概述
    • 创建自定义权限类
    • 使用自定义权限类
  • 使用TokenAuthentication身份验证
    • 配置
    • 执行数据库迁移
    • 创建一个认证令牌
    • 创建视图
    • 测试

认证与权限

Django REST Framework (DRF)提供了一系列的认证与权限功能来保护Web API不被未授权用户访问或滥用。

认证(Authentication)

在DRF中,认证是指验证用户身份的过程,如果用户提供的凭据(例如用户名和密码)通过验证,则认为该用户是经过认证的用户。

DRF支持多种认证方式:

SessionAuthentication: 基于django的session机制实现的认证方式,在使用时需要先登录获取session id,然后发送请求时携带该session id

BasicAuthentication: 基于HTTP Basic Authentication协议实现的认证方式,用户需要在请求头中携带base64编码后的用户名和密码

TokenAuthentication: 基于Token的认证方式,用户需要先通过用户名和密码获取一个Token,然后在每次请求时携带该Token进行认证

JSONWebTokenAuthentication: 基于JSON Web Token(JWT)的认证方式,具有无状态、可扩展性等优点

DRF框架默认在rest_framework.settings文件中进行了全局认证方案的设置

DEFAULTS = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
    	# sesssion认证
        'rest_framework.authentication.SessionAuthentication', 
        # 基本认证
        'rest_framework.authentication.BasicAuthentication' 
    )
}

在这里插入图片描述

权限(Permission)

在DRF中,权限是指控制用户对API资源访问的能力。权限控制可以限制用户对于视图API的访问和对于具体数据对象的访问。

1.在执行视图的dispatch()方法前,会先进行视图访问权限的判断

2.在通过get_object()获取具体对象时,会进行对象访问权限的判断

DRF提供了多种预设的权限类:

IsAuthenticated: 仅允许已经认证的用户访问

AllowAny: 允许任何人访问

IsAdminUser: 仅允许管理员用户访问

IsAuthenticatedOrReadOnly: 对于未认证的用户只允许进行读取操作,已认证用户可以执行任意操作

DjangoModelPermissions: 基于Django模型的权限控制,与Django admin中的权限控制类似

DjangoObjectPermissions: 基于Django模型对象的权限控制

也可以自定义权限类,实现更加灵活的权限控制。

DRF框架默认在rest_framework.settings文件中进行了全局权限控制方案的设置

DEFAULTS = {
    'DEFAULT_PERMISSION_CLASSES': (
       'rest_framework.permissions.AllowAny', # 允许所有人
    )
}

认证和权限的使用

创建用户用于验证

使用Django自带用户认证系统,创建一个用户,用于登录验证

import os

from django.test import TestCase

from django.contrib.auth.models import User
if not os.environ.get('DJANGO_SETTINGS_MODULE'):
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meiduo_mall.settings')

import django
django.setup()


class MyTest(TestCase):
    User.objects.create_user(username='admin', password='admin')

配置认证与权限(全局)

可以在DRF项目的settings.py文件中修改DRF框架的全局认证方案与全局权限控制方案

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # 基本认证
        'rest_framework.authentication.BasicAuthentication',
        # sesssion认证
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        # 将全局权限控制方案设置为仅允许认证用户访问
        'rest_framework.permissions.IsAuthenticated',
    )
}

认证与权限控制配置好后,访问某URL将出现BasicAuthentication认证框。

在这里插入图片描述
认证成功:
在这里插入图片描述
认证失败:
在这里插入图片描述

视图指定认证与权限(局部)

可以在每个视图中通过设置authentication_classess属性与permission_classes 属性设置视图的认证与权限方案

from rest_framework.authentication import SessionAuthentication, BasicAuthentication

class TestView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    # 指定当前视图的认证方案,不使用全局认证方案
    authentication_classess = [BasicAuthentication, SessionAuthentication]
    # 指定当前视图的权限控制方案,不使用全局权限控制方案
    permission_classes = [IsAuthenticated]

配合权限,如果认证失败会有两种可能的返回值:

401 Unauthorized 未认证

403 Permission Denied 权限被禁止

自定义权限

概述

自定义权限控制类,需继承rest_framework.permissions.BasePermission父类,并实现以下两个任何一个方法或全部方法。

.has_permission(self, request, view) :

判断对使用此权限类的视图是否有访问权限, request表示请求对象,view表示当前视图对象,必须返回一个布尔值,指示请求是否被允许。

.has_object_permission(self, request, view, obj):

判断使用此权限类视图某个数据对象是否有访问权限, request表示请求, view表示当前视图, obj为数据对象

两者区别:

如果要在全局范围内控制某些操作,则使用has_permission()方法。如果要在单个对象级别控制某些操作,则使用has_object_permission()方法。

注意:

如果请求被授予访问权限,方法应该返回True,否则返回False。仅当视图级has_permission检查已通过时,才会调用实例级has_object_permission方法。

创建自定义权限类

创建一个名为MyPermission的自定义权限类。该类继承DRF的BasePermission,并覆盖了其中的has_permission方法与has_object_permission方法。

from rest_framework.permissions import BasePermission


class MyPermission(BasePermission):
    # 判断对使用此权限类的视图是否有访问权限
    def has_permission(self, request, view):
        # 任何用户对使用此权限类的视图都没有访问权限
        return True

    # 判断对使用此权限类视图某个数据对象是否有访问权限
    def has_object_permission(self, request, view, obj):
        # 对id为1,3的数据对象有访问权限
        print(obj)
        if obj.id in (1, 3):
            return True
        return False

使用自定义权限类

class TestView(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer

    # 指定当前视图的认证方案,不使用全局认证方案
    # authentication_classess = [BasicAuthentication, SessionAuthentication]
    # 指定当前视图的权限控制方案,不使用全局权限控制方案
    # permission_classes = [IsAuthenticated]
    # 使用自定义的权限控制类
    permission_classes = [MyPermission]

使用TokenAuthentication身份验证

在Django REST Framework中,可以使用TokenAuthentication来进行身份验证。TokenAuthentication是基于令牌的身份验证方式,通过向每个用户分配唯一的令牌来识别用户。当用户发送请求时,他们需要在请求头中包含该令牌以进行身份验证。

配置

在settings.py文件中配置

在INSTALLED_APPS中添加rest_framework.authtoken应用程序

INSTALLED_APPS = [
    'rest_framework.authtoken',
]

在REST_FRAMEWORK中配置认证与权限类

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        # 设置使用JSON渲染器
        'rest_framework.renderers.JSONRenderer',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        # 使用TokenAuthentication认证
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        # 使用IsAuthenticated权限类确保已登录用户才能访问API
        'rest_framework.permissions.IsAuthenticated',
    ],
}

执行数据库迁移

1.在项目根目录下执行命令来生成迁移文件

python manage.py makemigrations

2.运行命令来应用最新的数据库迁移

python manage.py migrate

3.如果曾经手动删除authtoken_token表,请将该表重新创建。通过运行命令来创建该表

python manage.py migrate rest_framework.authtoken

注意: 在进行数据库迁移之前,请务必备份数据库以避免数据丢失。

创建一个认证令牌

先创建一个john用户对象,然后获取john用户对象,使用该对象创建一个Token对象。最后就可以使用这个Token来进行API请求的认证。

# 设置Django运行所依赖的环境变量
import os

from django.test import TestCase

if not os.environ.get('DJANGO_SETTINGS_MODULE'):
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'drf_demo.settings')

# 让Django进行一次初始化
import django

django.setup()

from django.contrib.auth.models import User
from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User


class MyTest(TestCase):
    # User.objects.create(username='john', password='password')

    user = User.objects.get(username='john')
    token = Token.objects.create(user=user)
    print(token)

创建视图

创建一个MyView视图,然后添加身份验证

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

class MyView(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response({'username': request.user.username})

配置路由

urlpatterns = [
    re_path(r'^test/$', views.MyView.as_view(), name='test'),
]

测试

发送请求,Django REST Framework将检查请求头中是否包含有效的令牌,如果是,则允许该请求。
在这里插入图片描述
无效的令牌,拦截。

{
	"detail": "Authentication credentials were not provided."
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/443567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode二叉树的相关题目

110. 平衡二叉树 方法:递归 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullpt…

漫谈大数据 - HiveSQL总结(一)库表操作

导语:针对hive各种数据库操作,内部表、外部表、分区表、分桶表的表属性查看修改操作以及hive数据的导入与导出详解。 hive简介: hive是基于Hadoop的一个数据仓库工具,用来进行数据提取、转化、加载,这是一种可以存储、…

双系统安装Windowslinux

文章目录 1.1 联想小新windows10重装1.2 宏基暗影骑士windows10重装2.1 ubuntu18.04重装1)清理空间并制作U盘启动2)ubuntu分区 3.1 ros安装4.1 deb包安装5.1 网络设置6.1 VSCode环境配置 1.1 联想小新windows10重装 bioss设置 ①微软官网制作u盘启动 ②…

微信小程序PHP+python+nodejs+springboot+vue 电影院订票选座系统

管理员的主要功能有: 1.管理员输入账户登陆后台 2.个人中心:管理员修改密码和账户信息 3.会员管理:对注册的会员信息进行删除,查询,添加,修改 4.电影分类管理:对电影的分类信息进行添加&#xf…

python+nodejs+springboot+vue 教学师生互动答疑系统

然后遵循软件常规开发流程,首先针对系统选取适用的语言和开发平台,根据需求分析制定模块并设计数据库结构,再根据系统总体功能模块的设计绘制系统的功能模块图,流程图以及E-R图。然后,设计框架并根据设计的框架编写代码…

浅学WebFlux--构建一个响应式的SpringBoot服务

前言 看惯了SpringMVC,最近在闲来之余抽空了解了一下Spring早已发布并支持的一种新web框架-WebFlux。由于这玩意的使用需要具备的基础是Reactive programming 的理解、Reactor 的基础以及熟练的java8 lambda使用。但是并不影响笔者摸着石头过河……在此做个浅学笔记…

【三十天精通Vue 3】第十二天 Vue 3 过滤器详解(已废弃)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue 3 过滤器概述1.1 过滤器的简介1.2 过滤器的作用1.3 过…

创建Vue3.0工程

1.使用 vue-cli 创建 官方文档:创建一个项目 | Vue CLI (vuejs.org) ## 查看vue/cli版本,确保vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的vue/cli npm install -g vue/cli ## 创建 vue create vue_test ## 启动 cd vue_test npm run se…

7年时间,从功能测试到测试开发月薪30K,有志者事竟成

突破自己的技术瓶颈并不是一蹴而就,还是需要看清楚一些东西,这里也有一些经验和见解跟大家分享一下。同样是职场人士,我也有我的经历和故事。在工作期间,我有过2年加薪5次的小小“战绩”(同期进入公司的员工&#xff0…

番外12:ADS导出到AD变为PCB文件

番外12:ADS导出到AD变为PCB文件并嘉立创制板 番外12:ADS导出到AD变为PCB文件,此处的示例为功率放大器! STEP 1: 从ADS导出dxf文件 打开制作好的版图文件,在原有基础上打好散热孔和固定孔,散热孔半径0.63…

PCB阻焊桥存在的DFM(可制造性)问题,华秋一文告诉你

PCB表面的一层漆,称为阻焊油墨,也就是PCB线路板阻焊油墨。阻焊油墨是PCB线路板中非常常见、也是主要使用的油墨,一般90%都是绿色,但也有杂色油墨:红色、蓝色、黑色、白色、黄色等。 阻焊油墨的作用就是绝缘&#xff0…

反射:替对象执行方法

反射,可不只是利用Class创建对象哟,更重要是替对象执行方法!关于反射创建对象,它可以提供一种通用的机制,对任意Class对象得到它的实例,而不需要import。 举个例子,Spring底层就是利用反射为我…

各种文字生成图片的AIGC模型(openAI、谷歌、stable、Midjourney等)

1 前言 AIGC,全名“AI generated content”,又称生成式AI,意为人工智能生成内容。例如AI文本续写,文字转图像的AI图、视频等。 本文主要描述文字生成图片的模型。而且目前扩散模型(Diffusion Models)流行…

CANoe使用记录(一):新建Canoe工程

目录 1、概述 2、新建工程 2.1、新建工程界面 2.2、查看License 2.3、添加DBC文件 2.4、测量窗口 2.5、通道用量 2.6、通道匹配 2.7、硬件通道配置 2.8、状态监控 1、概述 Canoe是德国Vector公司推出的一款总线开发设备,主要用于总线类的开发、仿真、测试…

【Python】【进阶篇】二十六、Python爬虫的Scrapy爬虫框架

目录 二十六、Python爬虫的Scrapy爬虫框架26.1 Scrapy下载安装26.2 创建Scrapy爬虫项目1) 创建第一个Scrapy爬虫项目 26.3 Scrapy爬虫工作流程26.4 settings配置文件 二十六、Python爬虫的Scrapy爬虫框架 Scrapy 是一个基于 Twisted 实现的异步处理爬虫框架,该框架…

【Java 数据结构】单链表经典面试题 (动图解析)

🎉🎉🎉点进来你就是我的人了 博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔🦾&am…

Redis问题

一、认识Redis 1. 什么是 Redis? Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。Redis 提供了多种数据类型来支持不同的业务场景&#…

vue-seamless-scroll无缝滚动组件使用方法详解+解决轮播空白缝隙问题(最后面)

下载安装 1.npm npm install vue-seamless-scroll --save 2.yarn yarn add vue-seamless-scroll 使用 1、全局注册 import Vue from vue import scroll from vue-seamless-scroll Vue.use(scroll) //或者 //Vue.use(scroll,{componentName: scroll-seamless}) 2、局部注册 im…

刘强东的“百亿补贴” 被指“雷”声大雨点小

京东集团2022年财报显示,2022年第四季度京东收入为2954亿元,同比增加7.1%,与2021年四季度23%的同比增速确有不小的差距。前三季度对应的同比增速分别为17.95%、5.44%和11.35%,与2021年相比均有回落。从财报中可以看出,…

什么是Selenium?使用Selenium进行自动化测试

什么是 Selenium? Selenium 是一种开源工具,用于在 Web 浏览器上执行自动化测试(使用任何 Web 浏览器进行 Web 应用程序测试)。   等等,先别激动,让我再次重申一下,Selenium 仅可以测试Web应用…