Django DRF ModelViewSet自定义权限问题:管理员可操作经理无权限
Django DRF ModelViewSet自定义权限异常修复
问题场景
需求:
- 所有已认证用户可执行
list、retrieve操作 - 仅Admin和Manager组用户可执行
create、update、destroy操作
现有代码中,Admin用户操作正常,但Manager组用户执行写操作时收到权限错误:
"detail": "You do not have permission to perform this action."
问题原因
DRF的权限机制是所有指定的权限类必须全部通过,你的代码中写了permission_classes = [IsAdminUser, IsManager],这意味着用户必须同时满足是Admin且是Manager组用户才能通过权限校验——显然Manager组用户不是Admin,因此被IsAdminUser权限类拒绝。
修复方案
需要将权限逻辑改为或关系:用户是Admin,或者是Manager组用户,即可通过校验。以下两种方法任选其一:
方法1:自定义组合权限类
修改permissions.py,新增一个合并Admin和Manager判断的权限类:
from rest_framework import permissions class IsManager(permissions.BasePermission): def has_permission(self, request, view): if request.user.is_authenticated: return request.user.groups.filter(name='manager').exists() return False class IsAdminOrManager(permissions.BasePermission): def has_permission(self, request, view): # 满足任一条件即可:是超级管理员,或是Manager组用户 return request.user.is_superuser or IsManager().has_permission(request, view)
然后修改views.py中的get_permissions方法:
def get_permissions(self): if self.action in ['update', 'partial_update', 'destroy', 'create']: self.permission_classes = [IsAdminOrManager] elif self.action in ['list', 'retrieve']: self.permission_classes = [IsAuthenticated] return super().get_permissions()
方法2:使用DRF内置的Or权限组合(DRF 3.10+适用)
直接用DRF提供的Or类组合两个权限,无需自定义新权限类:
首先在views.py中导入Or:
from rest_framework.permissions import IsAuthenticated, IsAdminUser, Or
然后修改get_permissions方法:
def get_permissions(self): if self.action in ['update', 'partial_update', 'destroy', 'create']: self.permission_classes = [Or(IsAdminUser, IsManager)] elif self.action in ['list', 'retrieve']: self.permission_classes = [IsAuthenticated] return super().get_permissions()
额外检查项
- 确认Manager组用户确实被添加到名为
manager的用户组中(注意组名大小写敏感,若组名是Manager则需修改权限类中的过滤条件) - 验证用户的认证状态确保正常(TokenAuthentication配置无误)
内容的提问来源于stack exchange,提问作者Domenico Collacciani
相关产品推荐
相关产品推荐

