Django REST Framework(十九)权限

2024-08-28 05:28

本文主要是介绍Django REST Framework(十九)权限,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Django REST framework (DRF) 的权限认证涉及以下几个方面:全局权限配置、局部权限配置、自定义权限类、以及自定义认证类。以下是关于这些方面的详细说明:

1. 全局权限配置

在 Django 项目的配置文件 settings.py 中,可以全局配置 DRF 的权限管理类。这种设置适用于整个项目中的所有视图。默认情况下,如果不做任何配置,DRF 会允许所有用户访问视图(AllowAny)。

# settings.py
REST_FRAMEWORK = {'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated',  # 仅允许已通过身份认证的用户访问)
}

在此配置下,所有视图都会默认要求用户通过身份认证,否则无法访问。

2. 局部权限配置

局部权限配置可以覆盖全局设置,适用于单独的视图或视图集。通过为视图类指定 permission_classes 属性,可以定义该视图的权限控制。

from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIViewclass ExampleView(APIView):permission_classes = [IsAuthenticated]  # 仅允许已认证用户访问该视图...

局部配置让你可以在不同视图中应用不同的权限策略,提供了更灵活的控制。

3. 自定义权限类

有时内置的权限类不能满足所有需求,此时可以通过继承 rest_framework.permissions.BasePermission 类来创建自定义权限类。在这个类中,需要实现以下两个方法之一或全部:

  • .has_permission(self, request, view):判断用户是否有权访问视图。
  • .has_object_permission(self, request, view, obj):判断用户是否有权对特定模型对象执行操作。

例如,定义一个只允许角色为“xiaoming”的用户访问视图的权限类:

from rest_framework.permissions import BasePermissionclass IsXiaoMingPermission(BasePermission):"""仅允许角色为 'xiaoming' 的用户访问的自定义权限类"""def has_permission(self, request, view):role = request.query_params.get("role")return role == "xiaoming"def has_object_permission(self, request, view, obj):# 这里可以加入对模型对象的权限控制逻辑return True

在视图中使用这个自定义权限类:

from .permissions import IsXiaoMingPermission
from rest_framework.viewsets import ModelViewSet
from student.models import Student
from student.serializers import StudentSerializerclass StudentViewSet(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentSerializerpermission_classes = [IsXiaoMingPermission]  # 应用自定义权限类

4. 自定义认证类

自定义认证类用于扩展或替代 DRF 提供的默认认证机制(如 Session 认证、Basic 认证等)。自定义认证类需要继承 rest_framework.authentication.BaseAuthentication 并实现 authenticate(self, request) 方法。

from rest_framework.authentication import BaseAuthentication
from django.contrib.auth.models import Userclass CustomAuthentication(BaseAuthentication):"""自定义认证类,根据请求参数中的角色进行认证"""def authenticate(self, request):role = request.query_params.get("role")if role == "root":user = User.objects.get(pk=1)  # 假设用户 ID 为 1 的是超级管理员return (user, None)return None

在视图中使用自定义认证类:

from .authentications import CustomAuthentication
from rest_framework.viewsets import ModelViewSet
from student.models import Student
from student.serializers import StudentSerializerclass Student1ModelViewSet(ModelViewSet):queryset = Student.objects.all()serializer_class = StudentSerializerauthentication_classes = [CustomAuthentication]  # 使用自定义认证类permission_classes = [IsAuthenticated]  # 使用内置权限类

5. 总结

通过全局配置、局部配置、自定义权限类和自定义认证类,可以实现复杂的权限和认证逻辑,满足项目中不同的安全需求。这种灵活性使得 Django REST framework 成为处理复杂 API 需求的强大工具。

这篇关于Django REST Framework(十九)权限的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113856

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Java访问修饰符public、private、protected及默认访问权限详解

《Java访问修饰符public、private、protected及默认访问权限详解》:本文主要介绍Java访问修饰符public、private、protected及默认访问权限的相关资料,每... 目录前言1. public 访问修饰符特点:示例:适用场景:2. private 访问修饰符特点:示例:

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Django中使用SMTP实现邮件发送功能

《Django中使用SMTP实现邮件发送功能》在Django中使用SMTP发送邮件是一个常见的需求,通常用于发送用户注册确认邮件、密码重置邮件等,下面我们来看看如何在Django中配置S... 目录1. 配置 Django 项目以使用 SMTP2. 创建 Django 应用3. 添加应用到项目设置4. 创建

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO