Django rest framework 如何在Django Rest中隐藏或更改对/api/endpoint的权限?
我想禁用或设置/api/endpoint上的管理员权限,否则任何人都可以查看我们的整个api。但是,我不想完全删除django rest UI——我只想阻止人们查看所有端点的列表 似乎有两种可能的解决方案:Django rest framework 如何在Django Rest中隐藏或更改对/api/endpoint的权限?,django-rest-framework,Django Rest Framework,我想禁用或设置/api/endpoint上的管理员权限,否则任何人都可以查看我们的整个api。但是,我不想完全删除django rest UI——我只想阻止人们查看所有端点的列表 似乎有两种可能的解决方案: 放入重定向或以某种方式隐藏端点 在端点上设置仅管理员权限(并且仅该端点-因此,仅在/api/-而不是/api/things/) 我想知道是否有一种“正确”的方法来解决这个问题。您可以使用它来设置/api/端点上的管理员用户权限检查。 比如说,MyView是/api/端点的视图类。我们将在
- 放入重定向或以某种方式隐藏端点
- 在端点上设置仅管理员权限(并且仅该端点-因此,仅在/api/-而不是/api/things/)
/api/
端点上的管理员用户权限检查。
比如说,MyView
是/api/
端点的视图类。我们将在此视图上设置权限类。这将使我们的API只对管理员用户开放
对于基于类的视图:
from rest_framework.permissions import IsAdminUser
class MyView(..):
permisssion_classes = (IsAdminUser,) # set the permission class
..
@permission_classes((IsAdminUser, ))
def my_view(..):
...
对于基于函数的视图:
from rest_framework.permissions import IsAdminUser
class MyView(..):
permisssion_classes = (IsAdminUser,) # set the permission class
..
@permission_classes((IsAdminUser, ))
def my_view(..):
...
这将拒绝任何拥有
用户的用户的权限。is_staff
值为False
,否则,权限将被允许。Rahul的回答在技术上是正确的,但我还需要先做些其他事情
我最初有:
router.register(r'things', things_viewsets.ThingViewSet)
...
urlpatterns = patterns('',
url((r'^api/'), include(router.urls)),
....
)
我需要做的是:
router.register(r'api/things', things_viewsets.ThingViewSet)
....
urlpatterns += router.urls
然后,我可以简单地删除/api/并将其设置为404,或者正如Rahul所解释的那样,我可以将auth添加到其中。我解决这个问题的方法可能不是最优雅的,但它可以作为一个例子 url.py
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet, base_name='users')
router.register(r'groups', views.GroupViewSet, base_name='groups')
router.register(r'tasks', views.TasksViewSet, base_name='tasks')
urlpatterns = [
url(r'^$', views.APIRoot.as_view()),
url(r'', include(router.urls)),
...
]
from rest_framework.views import APIView
from rest_framework.response import Response
class APIRoot(APIView):
"""
API Root ...
"""
def get(self, request):
data = {
"users": "http://localhost:5000/users/",
"groups": "http://localhost:5000/groups/",
"tasks": "http://localhost:5000/tasks/",
}
if not request.user.is_superuser:
data.pop("users")
data.pop("groups")
return Response(data)
视图.py
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet, base_name='users')
router.register(r'groups', views.GroupViewSet, base_name='groups')
router.register(r'tasks', views.TasksViewSet, base_name='tasks')
urlpatterns = [
url(r'^$', views.APIRoot.as_view()),
url(r'', include(router.urls)),
...
]
from rest_framework.views import APIView
from rest_framework.response import Response
class APIRoot(APIView):
"""
API Root ...
"""
def get(self, request):
data = {
"users": "http://localhost:5000/users/",
"groups": "http://localhost:5000/groups/",
"tasks": "http://localhost:5000/tasks/",
}
if not request.user.is_superuser:
data.pop("users")
data.pop("groups")
return Response(data)
您应该在
url.py
中使用SimpleRouter()
而不是DefaultRouter()
定义根
/api/
端点视图的APIRootView类有一个\u ignore\u model\u permissions
设置为True
。此属性用于确保DjangoModelPermissions
有效,因为DefaultRouter
根视图没有queryset
属性,因此DjangoModelPermissions
有效
简而言之,如果将APIRootView
权限设置为有效权限(例如已验证
),则可以安全地将\u ignore\u model\u permissions
设置为False
,这将导致权限类应用于根视图。例如:
类MyRouter(routers.DefaultRouter):
定义初始化(self,*args,**kwargs):
self.APIRootView.\u忽略\u模型\u权限=False
self.APIRootView.permission_classes=[IsAuthenticated]
super()
请注意,我们正在修改self.APIRootView
,因为DefaultRouter
在中拉取APIRootView
请注意,\u ignore\u model\u permissions
是一个私有的、未记录的属性,因此不能保证它将来会继续工作。您可以将您尝试过的代码发布在一个单独的问题中,最好是在一个包含所有详细信息的问题中。Rahul Gupta,ideia将限制API\u根列表。如果基于权限,它应该是这样的:超级用户获取json:{users,groups,files…}normaluser获取{files…}。您对如何做到这一点有什么想法吗?当前的答案只涉及限制API根目录,即/API/
url到管理员用户。它不会根据需要限制API根URL。很抱歉,目前我还不知道直接这样做的方法。即使您限制API根目录中的URL,您也必须在用户
和组
视图上添加权限类,以限制管理员用户的访问权限。比方说,如果让API根完全可见,但在所有视图上添加了权限类,那么如果普通用户尝试访问users
API,DRF将不会授予该用户访问权限。因此,普通用户将无法访问用户
和组
API,但他可以看到这些URL。是的,始终需要类的权限。最好是限制端点列表。