如何在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
相关产品推荐
相关产品推荐

