我正在为一个移动应用程序开发一个django rest框架后端。API是私有的,只能在内部使用。
可浏览的API对于帮助开发人员处理项目很方便,但是我想阻止没有设置为项目管理员的任何人使用可浏览的接口。
我认识到,可浏览的管理员不会授予用户在其他情况下不具有的任何权限,但它确实具有一些安全灰色区域(例如,对于具有外键关系的模型,HTML选择器字段将填充数据库中所有可能的相关对象,除非您指定我指示它不要。
因为这个应用程序处理敏感的用户数据,我更愿意将尽可能小的表面积暴露给公众,以减少我自己潜在的疏忽大意的风险。
是否有任何方法可以禁用非管理员用户的可浏览API而不为所有人禁用它?我已经做了大量的谷歌搜索,并一直在寻找,但还没有找到答案。这个问题很接近,但并不相同,因为这些指令会禁用每个人的界面。
最佳答案
在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