繁体   English   中英

如何将 Django Rest Framework 可浏览的 API 接口限制为管理员用户

[英]How to restrict Django Rest Framework browsable API interface to admin users

我正在为移动应用程序开发 Django Rest Framework 后端。 API 是私有的,只会在内部使用。

可浏览 API 可方便地帮助开发人员处理项目,但我想阻止任何未设置为项目管理员的人使用可浏览界面。

我意识到可浏览的管理员不会授予用户原本不会拥有的任何权限,但它确实有一些安全灰色区域(例如,对于具有外键关系的模型,HTML 选择器字段填充了所有可能的相关对象在数据库中,除非您特别指示不要这样做)。

因为这个应用程序处理敏感的用户数据,我更愿意向公众公开尽可能小的表面区域,以减少我自己的潜在错误疏忽的风险。

有什么方法可以为非管理员用户禁用可浏览的 API,而无需为所有人​​禁用它? 我已经做了大量的谷歌搜索并查看了 SO 并没有找到答案。 这个问题很接近如何禁用 django-rest-framework 的管理式可浏览界面? 但不一样,因为这些说明禁用了每个人的界面。

“DEFAULT_PERMISSION_CLASSES”设置还不够吗? 对默认权限类的所有视图DRF 文档设置了默认限制

settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAdminUser',
    ]
}

他们将“到达”可浏览的界面,但如果未经授权,所有类型的请求都将被拒绝。

如果由于某种原因需要非管理员用户到达各种端点,您可以在逐个视图的基础上放宽限制。

假设您使用的是 DRF 的内置视图,我认为您可以覆盖get_renderers()

在您的设置文件中:

REST_FRAMEWORK = {
    # Only enable JSON renderer by default.
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ],
}

然后在您的views.py

from rest_framework import generics, renderers

class StaffBrowsableMixin(object):
    def get_renderers(self):
        """
        Add Browsable API renderer if user is staff.
        """
        rends = self.renderer_classes
        if self.request.user and self.request.user.is_staff:
            rends.append(renderers.BrowsableAPIRenderer)
        return [renderer() for renderer in rends]

class CustomListApiView(StaffBrowsableMixin, generics.ListAPIView):
    """
    List view.
    """
    # normal stuff here

rest_framework的意见,我们有一个属性,叫做renderes_classes通常我们有一个方法get_<something> ,因为我们做queryset / get_queryset但在这种情况下,我们没有这个,所以我需要实现一个属性。

from tasks.models import Task
from tasks.serializers import TaskSerializer

from rest_framework.generics import ListAPIView
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework.renderers import CoreJSONRenderer


class CustomRendererView:
    permission_classes = (IsAuthenticatedOrReadOnly,)

    @property
    def renderer_classes(self):
        renderers = super(ListTask, self).renderer_classes

        if not self.request.user.is_staff:
            renderers = [CoreJSONRenderer]

        return renderers


class ListTask(CustomRendererView, ListAPIView):
    queryset = Task.objects.all()
    serializer_class = FullTaskSerializer

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM