You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:06:35