Django REST Framework View 集每个操作权限

标签 django django-rest-framework django-permissions

是否有最佳实践为给定 APIViewViewSet 的每个操作分配不同的权限?

假设我定义了一些权限类,例如“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/

相关文章:

django - Django REST 中的上下文感知可浏览 API 呈现

python - 有人可以建议如何实现自定义 Django PasswordResetView 吗?

rest - 如何使用不同的端点集动态创建权限组 Django Rest Framework

python - Django 将属性添加到 SelectMultiple <option> 标签

python - 值错误 : "..." needs to have a value for field "..." before this many-to-many relationship can be used

python - 在*没有* Internet 连接的情况下安装 MySQLDb python 模块

django - 使用自定义用户模型在管理员中添加员工用户权限

python - 无法使用 pip 安装 mysqlclient (Ubuntu 18.04 LTS)

python - Django 休息框架唯一一起错误消息不再显示

django - 如何在 Django 抽象模型类中动态命名权限?