[英]How to restrict Django Rest Framework browsable API interface to admin users
我正在为移动应用程序开发 Django Rest Framework 后端。 API 是私有的,只会在内部使用。
可浏览 API 可方便地帮助开发人员处理项目,但我想阻止任何未设置为项目管理员的人使用可浏览界面。
我意识到可浏览的管理员不会授予用户原本不会拥有的任何权限,但它确实有一些安全灰色区域(例如,对于具有外键关系的模型,HTML 选择器字段填充了所有可能的相关对象在数据库中,除非您特别指示不要这样做)。
因为这个应用程序处理敏感的用户数据,我更愿意向公众公开尽可能小的表面区域,以减少我自己的潜在错误疏忽的风险。
有什么方法可以为非管理员用户禁用可浏览的 API,而无需为所有人禁用它? 我已经做了大量的谷歌搜索并查看了 SO 并没有找到答案。 这个问题很接近如何禁用 django-rest-framework 的管理式可浏览界面? 但不一样,因为这些说明禁用了每个人的界面。
假设您使用的是 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.