如何在Django Rest Framework中限制对经过身份验证的用户的查看

时间:2015-07-14 12:14:51

标签: django authentication django-rest-framework

我有一个Django Rest Framework应用程序。 身份验证通过登录方法执行:

def login(self, request):
    user = find_my_user(request)
    user.backend = 'django.contrib.auth.backends.ModelBackend'
    login(request, user)
    return Response({"status": "ok"})

身份验证有效。

我有一个具有list_route()的ViewSet,需要使用经过身份验证的用户。 这是代码:

class CommonView(viewsets.ViewSet):
    @list_route()
    @authentication_classes(SessionAuthentication)
    @permission_classes(IsAuthenticated)
    def connected(self, request):
        return Response({"status": "ok"})

即使用户未经过身份验证(没有会话cookie),也会执行操作。

作为一种解决方法,我已经这样做了:

class CommonView(viewsets.ViewSet):
    @list_route()
    def connected(self, request):
        if request.user.is_authenticated():
            return Response({"status": "ok"})
        else:
            return Response({"status": "ko", "message": "Unauthenticated"})

但我觉得它可能更干净,任何想法?

2 个答案:

答案 0 :(得分:0)

您可以创建一个继承自ListRouteIsAuthenticated类的自定义BasePermission权限类,该类将拒绝对list路由中任何请求的未经身份验证的用户授予任何权限。

对于detail路由请求,无论请求是经过身份验证还是未经身份验证,都将允许不受限制的访问。

from rest_framework.permissions import  BasePermission

class ListRouteIsAuthenticated(BasePermission):
    """
    Custom Permission Class which authenticates a request for `list` route
    """

    def has_permission(self, request, view):
        if view.action == 'list':
            return request.user and request.user.is_authenticated() #  check user is authenticated for 'list' route requests
        return True # no authentication check otherwise

然后在您的视图集中,您需要定义此权限类。

class CommonView(viewsets.ViewSet):

    permission_classes = [ListRouteIsAuthenticated]
    ...

答案 1 :(得分:-1)

根据文档,添加一个属性:

class CommonView(viewsets.ModelViewSet):

    permission_classes = [IsAuthenticated]