当前位置: 首页 > news >正文

Django DRF实现用户数据权限控制

在 Django DRF 中使用 ModelViewSet 时,若需实现用户仅能查看和操作自己的数据详情,同时允许所有认证用户访问列表,需结合权限类和动态权限分配。以下是具体步骤:

1. 自定义对象权限类

创建一个 IsOwner 权限类,检查请求用户是否为对象所有者:

python
from rest_framework import permissionsclass IsOwner(permissions.BasePermission):def has_object_permission(self, request, view, obj):# 确保只有所有者可以执行对象级别的操作(如详情、更新、删除)return obj.owner == request.user
### 2. 在 ModelViewSet 中动态分配权限

覆盖 get_permissions 方法,根据不同操作应用不同权限:

python
from rest_framework import viewsets, permissions
from .models import MyModel
from .serializers import MyModelSerializerclass MyModelViewSet(viewsets.ModelViewSet):queryset = MyModel.objects.all()serializer_class = MyModelSerializerdef get_permissions(self):# 针对列表和创建操作,仅需用户认证if self.action in ['list', 'create']:permission_classes = [permissions.IsAuthenticated]else:# 针对详情、更新、删除,需认证且是所有者permission_classes = [permissions.IsAuthenticated, IsOwner]return [permission() for permission in permission_classes]

3. 过滤列表数据(推荐)

通常更安全的做法是过滤列表仅显示用户自己的数据,避免信息泄露:

python
def get_queryset(self):# 确保用户只能看到自己的数据return MyModel.objects.filter(owner=self.request.user)

此时权限类只需 IsAuthenticated,因为列表和详情已通过过滤限制数据访问:

python
class MyModelViewSet(viewsets.ModelViewSet):permission_classes = [permissions.IsAuthenticated]def get_queryset(self):return MyModel.objects.filter(owner=self.request.user)

总结方案

动态权限分配:通过 get_permissions 区分列表和详情操作的权限,允许列表访问但限制详情。

数据过滤:使用 get_queryset 过滤数据,确保用户只能访问自己的条目,这是更安全的做法。

选择方案取决于需求:

允许列表显示所有数据:动态权限 + 不过滤 queryset,但需注意数据暴露。

仅显示用户数据:过滤 queryset + 简单权限,更推荐此方式以确保数据安全。

相关文章:

  • 什么是数据库的DDL和DML,有什么区别?
  • Ollama API 应用指南
  • STM32与i.MX6ULL内存与存储机制全解析:从微控制器到应用处理器的设计差异
  • ROS 快速入门教程02
  • 游戏引擎学习第240天:将渲染器移至第三层
  • 【新能源科学与技术】MATALB/Simulink小白教程(一)实验文档【新能源电力转换与控制仿真】
  • C++入门小馆: 探寻vector类
  • 【华为】防火墙双击热备-之-主备模式-单外网线路
  • 第七节:进阶特性高频题-Vue3的ref与reactive选择策略
  • 0802api设计和实战-网络ajax请求1-react-仿低代码平台项目
  • 3.3 技术框架:LangChain、ReAct、Memory与Tool Integration
  • Axios 是一个基于 Promise 的 HTTP 客户端,可用于浏览器和 Node.js 环境。以下是它的一些主要作用
  • 精益数据分析(17/126):精益画布与创业方向抉择
  • 学习记录:DAY16
  • 玩转Docker | 使用Docker部署Neko自托管浏览器
  • 使用分布式ID作为MybatisID生成器
  • Eliciting Causal Abilities in Large Language Models for Reasoning Tasks
  • Kotlin 边界限制
  • vant Dialog组件调用的坑
  • 【Hive入门】Hive数据模型与存储格式深度解析:从理论到实践的最佳选择
  • 2025欧亚经济合作发展论坛在沪举办
  • 世界读书日|阅读在上海
  • 神舟二十号主要目的发布,在空间站驻留约6个月
  • 董明珠连任格力电器董事,回应管理层年轻化
  • 西安雁塔区委书记王征拟任市领导班子副职,曾从浙江跨省调任陕西
  • 浙江一季度GDP为22300亿元,同比增长6.0%