Django Rest Framework中仅限员工的权限

时间:2015-07-30 02:22:40

标签: django django-rest-framework

我正在尝试创建仅限员工的Django Rest Framework ModelViewSets。当我尝试使用标准的Django装饰器@staff_member_required时,我得到的错误让我相信装饰器不适用于Django Rest Framework。

所以我正在尝试编写自己的ModelViewSet mixin。它主要按照我的意愿工作,除了我无法工作的更新方法。

所以,有两个问题:有没有更优雅的方法来做到这一点,如果没有,我的更新方法有什么问题?我找不到任何关于更新的文档,所以我正在使用我最好的猜测如何超级它,但它不起作用。

谢谢!

约翰

这是我的班级:

class StaffOnlyModelViewSet(viewsets.ModelViewSet):

def list(self, request):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).list(request)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

def retrieve(self, request, pk=None):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).retrieve(request, pk=None)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

def create(self, request):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).create(request)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

def update(self, request, pk=None):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).update(request, pk=None)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

def destroy(self, request, pk=None):
    if self.request.user.is_staff:
        return super(StaffOnlyModelViewSet, self).destroy(request, pk=None)
    else:
        content = {'Unauthorised': 'This API is private'}
        return Response(content, status=status.HTTP_401_UNAUTHORIZED)

1 个答案:

答案 0 :(得分:15)

实现目标的更优雅方式是使用permissions。这些可以在视图级别全局声明,也可以使用装饰器

声明

来自source

class IsAdminUser(BasePermission):
    """
    Allows access only to admin users.
    """
    def has_permission(self, request, view):
        return request.user and request.user.is_staff

您可以在views.py中使用此功能(请参阅其他方式的文档)

from rest_framework.permissions import IsAdminUser

class StaffOnlyModelViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAdminUser,)

有些用户对权限和身份验证以及它们之间的关系感到困惑,因此我将为您提供快速入门。

Authentication定义了用户证明其身份的方法,权限定义了谁有权访问哪些资源。无论身份是否在身份验证期间得到验证,都将根据权限检查用户的请求。

组合在一起时,您可以控制用户访问权限。例如,如果用户验证失败但视图上的权限类设置为“IsAuthenticatedOrReadOnly”,则他们仍然可以获取/列出资源。 'IsAdminUser'声明用户必须已通过身份验证,并且还必须是工作人员才能访问此视图。在这种情况下,这就是你想要的。