DRF自定义权限实现:允许retrieve操作禁止list操作的方案咨询
解决方案
完全可以在不替换ModelViewSet的前提下实现该需求,Django Rest Framework的ViewSet会将当前请求对应的操作存放在view.action属性中,你可以通过这个属性直接区分同一个GET请求对应的是list还是retrieve操作。
修改后的权限类代码如下:
from rest_framework.permissions import BasePermission def is_superuser(request): return request.user.is_superuser class IsAdminOrReadOnlyOwner(BasePermission): def has_permission(self, request, view): if is_superuser(request): return True # 普通用户直接禁止访问list操作 if view.action == 'list': return False # 其余放行retrieve对应的GET请求和patch请求 return request.method in ['GET', 'PATCH'] def has_object_permission(self, request, view, obj): if is_superuser(request): return True # 校验当前访问的资源是否属于请求用户本人 return int(request.user.id) == obj.id
逻辑说明:
- 管理员全权限放行逻辑保持不变
- 普通用户的
list操作会在全局权限校验阶段直接拦截,从根源禁止访问全量用户列表 - 剩下的
retrieve(单条GET查询)和patch请求会进入对象权限校验阶段,仅当访问的是用户自身账号时放行 - 如果后续需要新增其他操作的权限控制,直接补充
view.action的判断条件即可,无需修改ModelViewSet的原有结构
内容的提问来源于stack exchange,提问作者Zyroox
相关产品推荐
相关产品推荐

