是否有最佳实践为给定 APIView
或 ViewSet
的每个操作分配不同的权限?
假设我定义了一些权限类,例如“IsAdmin”、“IsRole1”、“IsRole2”……,并且我想为单个操作授予不同的权限(例如,具有 Role1 的用户可以创建或检索,具有 Role2 的用户可以更新,只有管理员可以删除)。
如何构建基于类的 View ,以便将权限类分配给“创建”、“列表”、“检索”、“更新”、“删除”操作? 我试图这样做是为了有一个可以重复用于具有相同权限模式的不同表的类。
最佳答案
在 DRF 文档中,
Note: The instance-level has_object_permission method will only be called if the view-level has_permission checks have already passed
让我们假设以下关于 user
对象的权限
- 名单:仅限员工
- 创建:任何人
- 检索:自己或员工
- 更新、部分更新:自己或员工
- 销毁:仅限员工
permissons.py
from rest_framework import permissions
class UserPermission(permissions.BasePermission):
def has_permission(self, request, view):
if view.action == 'list':
return request.user.is_authenticated() and request.user.is_admin
elif view.action == 'create':
return True
elif view.action in ['retrieve', 'update', 'partial_update', 'destroy']:
return True
else:
return False
def has_object_permission(self, request, view, obj):
# Deny actions on objects if the user is not authenticated
if not request.user.is_authenticated():
return False
if view.action == 'retrieve':
return obj == request.user or request.user.is_admin
elif view.action in ['update', 'partial_update']:
return obj == request.user or request.user.is_admin
elif view.action == 'destroy':
return request.user.is_admin
else:
return False
views.py
from .models import User
from .permissions import UserPermission
from .serializers import UserSerializer
from rest_framework import viewsets
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
permission_classes = (UserPermission,)
对于 Django 2.0,将 is_authenticated()
替换为 is_authenticated
。方法已转为属性。
关于Django REST Framework View 集每个操作权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19313314/