【问题标题】:Django - Multiple permissions in a viewDjango - 视图中的多个权限
【发布时间】:2021-07-12 20:16:33
【问题描述】:

我想为可以验证用户是商店所有者还是管理员的视图创建权限。我已经创建了两个权限,当单独调用时它们工作得很好,其中一个检查用户是管理员,另一个检查用户是商店的所有者。我现在想创建一个全局条件来验证两个条件之一是否满足。

这是我的出发条件:

utils.py

class IsOwner(BasePermission):
    """
    Check if the user who made the request is owner.
    Use like that : permission_classes = [IsOwner]
    """
    def has_permission(self, request, view):
        return request.user and request.user.is_authenticated
    def has_object_permission(self, request, view, obj):
        try:
            user_shop = UserShop.objects.get(user=request.user, shop=obj)
            return True
        except:
            return False

class IsAdmin(BasePermission):
    """
    Check if the user who made the request is admin.
    Use like that : permission_classes = [IsAdmin]
    """
    def has_permission(self, request, view):
        if not 'Authorization' in request.headers:
            return False
        else:
            return request.user.is_admin

class OwnerView(GenericAPIView):
    """
    Check if a user is owner
    """
    permission_classes = (IsOwner,)

class AdminView(APIView):
    """
    Check if a user is admin
    """
    permission_classes = (IsAdmin,)

这是我想要做的功能:

class AdminOrOwnerView(GenericAPIView):
    """
    Check if a user is admin or owner
    """
    permission_classes = ( IsOwner|IsAdmin,)

目前,此条件允许任何登录用户使用我的视图

这是我的看法:

views.py

class ShopDetail(AdminOrOwnerView):
    """Edit ou delete a shop"""
    queryset = Shop.objects.all()
    lookup_field = 'path'

    def put(self, request, path):
        """For admin or shop owner to edit a shop"""
        shop = self.get_object()
        serializer = ShopSerializer(shop, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)

提前感谢您的帮助

【问题讨论】:

    标签: python django serialization django-rest-framework permissions


    【解决方案1】:

    您已使用以下方式组合了这两种权限:

    permission_classes = ( IsOwner|IsAdmin,)
    

    首先会调用 has_permission 并成功,因为在这种情况下,IsOwner 会为已登录的用户返回 True。接下来,当has_object_permission 再次被调用时,这会再次成功,因为这次IsAdmin 返回True(因为你还没有在那里实现任何东西)。

    一种解决方案是再次明确检查用户是否是has_object_permissionIsAdmin 的管理员:

    class IsAdmin(BasePermission):
        """
        Check if the user who made the request is admin.
        Use like that : permission_classes = [IsAdmin]
        """
        def has_permission(self, request, view):
            if not 'Authorization' in request.headers:
                return False
            else:
                return request.user.is_admin
        
        def has_object_permission(self, request, view, obj):
            return self.has_permission(request, view) # reuse `has_permission`
    

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 1970-01-01
      • 2014-07-06
      • 2019-06-12
      • 2013-10-19
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      相关资源
      最近更新 更多