首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Django Rest框架和字段级权限

Django Rest框架和字段级权限
EN

Stack Overflow用户
提问于 2015-09-10 12:56:48
回答 5查看 2.8K关注 0票数 5

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

代码语言:javascript
代码运行次数:0
运行
复制
database --- model ---- ModelSerializer ---- ModelViewSet --- browser

在ModelSerializer?在这里,我可以在字段到达视图集之前删除它们,但是默认情况下我没有访问request.user的权限,所以我必须实现它,这是可以实现的,但是不能很好地与我拥有的其他第三方库(django-rest-swagger)一起工作。

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

或者两者都有?当模型被序列化程序获取时,删除不允许在序列化程序中的读,然后在它们被传回序列化程序之前在视图集中删除不允许的写?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2015-09-10 17:30:10

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

代码语言:javascript
代码运行次数:0
运行
复制
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)

如果希望具有自定义权限检查器,可以定义自己的权限检查器,并使用自己的类指定替换IsAuthenticated

票数 1
EN

Stack Overflow用户

发布于 2015-09-10 17:35:50

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

根据get_serializer_class()上的DRF文档

可以重写以提供动态行为,例如使用不同的序列化程序进行读和写操作,或向不同类型的用户提供不同的序列化程序。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
class MyView(..):

    def get_serializer_class(self):
        if self.request.user.is_staff: # check if staff user
            return FullAccountSerializer 
        return BasicAccountSerializer
    ... 
票数 8
EN

Stack Overflow用户

发布于 2015-09-10 18:15:33

如果要实现自定义权限,请在DRF中很好地使用modelviewset。

代码语言:javascript
代码运行次数:0
运行
复制
from rest_framework import status, viewsets

class MyModelViewsets(viewsets.ModelViewSet):
    queryset = # queryset
    serializer_class = # serializer class
    permission_classes = (# custom permission class her)

如果希望对所有端点应用自定义权限,请在settings.py中指定

代码语言:javascript
代码运行次数:0
运行
复制
REST_FRAMEWORK = {

    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        # add custom permission here
    ]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32502554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档