Django rest framework 如何在Django Rest中隐藏或更改对/api/endpoint的权限?

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/endpoint上的管理员权限,否则任何人都可以查看我们的整个api。但是,我不想完全删除django rest UI——我只想阻止人们查看所有端点的列表

似乎有两种可能的解决方案:

  • 放入重定向或以某种方式隐藏端点
  • 在端点上设置仅管理员权限(并且仅该端点-因此,仅在/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。是的,始终需要类的权限。最好是限制端点列表。