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

rog*_*err 10 python security django django-rest-framework

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

可浏览的API便于帮助开发项目的开发人员,但我希望阻止任何未设置为项目管理员的人使用可浏览界面.

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

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

有没有办法为非管理员用户禁用可浏览的API而不为每个人禁用它?我已经做了大量的Google搜索并查看了SO并且没有找到答案.这个问题很接近如何禁用django-rest-framework的管理式可浏览界面?但不一样,因为这些指令会禁用每个人的界面.

rke*_*ler 6

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

settings.py

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAdminUser',
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是一个很好的答案。当 DEBUG=False 时,这实际上会禁用生产中的可浏览 api。 (2认同)

get*_*up8 6

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

在您的设置文件中:

REST_FRAMEWORK = {
    # Only enable JSON renderer by default.
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ],
}
Run Code Online (Sandbox Code Playgroud)

然后在你的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
Run Code Online (Sandbox Code Playgroud)


Lua*_*eca 0

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
Run Code Online (Sandbox Code Playgroud)