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

如何在Django REST Framework中配置多用户类型权限?

DRF ModelViewSet 分角色权限配置方案

核心思路

直接通过DRF的自定义权限类实现细粒度权限控制,无需修改模型权限。逻辑上按用户类型和请求方法分层判断:

  • 匿名用户:仅允许安全请求方法(GET/HEAD/OPTIONS,对应只读操作)
  • 已认证非管理员用户:允许安全方法 + DELETE(删除)操作
  • 管理员(is_staff=True):允许所有CRUD操作

1. 编写自定义权限类

在你的APP目录下新建permissions.py,实现权限判断逻辑:

from rest_framework import permissions

class CustomModelPermissions(permissions.BasePermission):
    def has_permission(self, request, view):
        # 匿名/所有用户都允许只读操作
        if request.method in permissions.SAFE_METHODS:
            return True
        
        # 管理员拥有完整权限
        if request.user.is_staff:
            return True
        
        # 已认证用户仅允许删除操作
        if request.user.is_authenticated and request.method == 'DELETE':
            return True
        
        # 其余操作一律拒绝
        return False

2. 配置ModelViewSet

在views.py中,将自定义权限类绑定到你的ModelViewSet:

from rest_framework.viewsets import ModelViewSet
from .models import YourModel  # 替换为你的模型类
from .serializers import YourModelSerializer  # 替换为你的序列化器
from .permissions import CustomModelPermissions

class YourModelViewSet(ModelViewSet):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer
    permission_classes = [CustomModelPermissions]  # 绑定自定义权限

3. 路由配置(无需修改)

之前用DefaultRouter注册路由的方式保持不变:

from rest_framework.routers import DefaultRouter
from .views import YourModelViewSet

router = DefaultRouter()
router.register(r'your-model', YourModelViewSet)  # 替换为你的路由前缀

urlpatterns = router.urls

额外说明

  • 无需修改模型的权限设置:DRF的自定义权限类直接在视图层拦截请求,比依赖Django模型权限更灵活
  • 管理员身份判断:is_staff=True的用户即为管理员,和Django Admin的配置完全一致,无需额外设置
  • 若需更细粒度控制(如仅允许用户删除自己创建的对象),可在权限类中重写has_object_permission方法补充判断逻辑

内容的提问来源于stack exchange,提问作者user3125823

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 03:22:39