Django Rest Framework 和字段级权限

Rob*_*wen 3 django rest django-rest-framework

我想构建一个具有字段级权限的 API。我从数据库表中获得了这些权限,但是在 REST 框架中检查用户是否可以对对象的字段执行 CRUD 操作的地方是什么?

database --- model ---- ModelSerializer ---- ModelViewSet --- browser
Run Code Online (Sandbox Code Playgroud)

在 ModelSerializer 中?在这里,我可以在字段到达视图集之前删除字段,但默认情况下我无权访问 request.user,因此我必须实现它,这可以完成,但不能与我拥有的其他第 3 方库一起使用(django-rest-swagger)

还是在 ModelViewset 中?我可以覆盖列表、创建、更新和销毁方法以删除用户无权访问的字段。但这不适用于我的 Metadata 实现,因为它直接从序列化程序获取元数据。

或者两者都有?例如:DROP不被允许读取串行当模型的获取通过串行,并在视图集落不被允许的写,之前他们得到传递回串行?

Rah*_*pta 6

您可以根据特定请求所需的字段创建不同的序列化程序。然后您需要get_serializer_class()在您的视图中覆盖该函数并根据您的逻辑决定序列化程序。

根据 DRF 文档 get_serializer_class()

可能会被覆盖以提供动态行为,例如使用不同的序列化程序进行读写操作,或者为不同类型的用户提供不同的序列化程序。

例如:

class MyView(..):

    def get_serializer_class(self):
        if self.request.user.is_staff: # check if staff user
            return FullAccountSerializer 
        return BasicAccountSerializer
    ... 
Run Code Online (Sandbox Code Playgroud)


djq*_*djq 1

DRF 文档中有一个关于权限的很好的部分。处理(和检查)它们的好地方是在视图集中。要从文档复制示例:

from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)

    def get(self, request, format=None):
        content = {
            'status': 'request was permitted'
        }
        return Response(content)
Run Code Online (Sandbox Code Playgroud)

如果您想要自定义权限检查器,您可以定义自己的权限检查器,并指定替换IsAuthenticated为您自己的类