rog*_*err 10 python security django django-rest-framework
我正在为移动应用程序开发Django Rest Framework后端.API是私有的,只能在内部使用.
可浏览的API便于帮助开发项目的开发人员,但我希望阻止任何未设置为项目管理员的人使用可浏览界面.
我意识到可浏览的管理员不会授予用户不会拥有的任何权限,但它确实有一些安全灰色区域(例如,对于具有外键关系的模型,HTML选择器字段会填充所有可能的相关对象在DB中,除非你明确指示它不要).
因为这个应用程序处理敏感的用户数据,我宁愿向公众公开可能的最小表面区域,以减少我自己潜在的错误疏忽的风险.
有没有办法为非管理员用户禁用可浏览的API而不为每个人禁用它?我已经做了大量的Google搜索并查看了SO并且没有找到答案.这个问题很接近如何禁用django-rest-framework的管理式可浏览界面?但不一样,因为这些指令会禁用每个人的界面.
“DEFAULT_PERMISSION_CLASSES”设置还不够吗?这对默认权限类的所有视图DRF 文档设置了默认限制
在settings.py:
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAdminUser',
]
}
Run Code Online (Sandbox Code Playgroud)
他们将“到达”可浏览的界面,但如果未经授权,所有类型的请求都将被拒绝。
如果由于某种原因需要非管理员用户到达各种端点,您可以在逐个视图的基础上放宽限制。
假设您使用的是 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)
在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)
| 归档时间: |
|
| 查看次数: |
1677 次 |
| 最近记录: |