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

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 + 简单权限,更推荐此方式以确保数据安全。

http://www.xdnf.cn/news/1384.html

相关文章:

  • 服务器数据恢复—双循环RAID5数据恢复揭秘
  • 2025.04.23华为机考第二题-200分
  • 第七节:进阶特性高频题-Vue3的ref与reactive选择策略
  • 数据结构初阶:二叉树(四)
  • CSS3 基础(边框效果)
  • 从 Vue 到 React:React.memo + useCallback 组合技
  • PCB规则
  • 【android bluetooth 协议分析 11】【AVDTP详解 2】【avdtp 初始化阶段主要回调关系梳理】
  • 基于FPGA 和DSP 的高性能6U VPX 采集处理板
  • 深入解析C++ STL Queue:先进先出的数据结构
  • Android Gradle Plugin (AGP) 和 Gradle 的關係
  • 【Qwen2.5-VL 踩坑记录】本地 + 海外账号和国内账号的 API 调用区别(阿里云百炼平台)
  • 学习记录:DAY16
  • 2.RabbitMQ - 入门
  • 从入门到精通:CMakeLists.txt 完全指南
  • AI语音助手自定义角色百度大模型 【全新AI开发套件掌上AI+4w字教程+零基础上手】
  • 永磁同步电机控制算法-反馈线性化控制
  • 官方不存在tomcat10-maven-plugin插件
  • 【模板匹配】图像处理(OpenCV)-part10
  • 【金仓数据库征文】从Oracle到KingbaseES的语法兼容与迁移
  • 常用第三方库精讲:cached_network_image图片加载优化
  • Chrome/Edge浏览器使用多屏完美解决方案,http部署使用https部署的功能
  • 互联网金融岗位简历模板
  • 3.第三章:数据治理的战略价值
  • 【人工智能】Ollama 负载均衡革命:多用户大模型服务的高效调度与优化
  • Vue3父子组件数据同步方法
  • gbase8s存储学习一 rootdbs存储结构以及寻址分析
  • 08-IDEA企业开发工具-集成AI插件通义灵码
  • Java—— 正则表达式 练习
  • 代理模式:控制对象访问的中间层设计