代码之家  ›  专栏  ›  技术社区  ›  Maverik Minett

django drf-通过权限限制对列表视图的访问

  •  0
  • Maverik Minett  · 技术社区  · 6 年前

    我有一个drf视图集,我正在添加 CanViewAndEditStaff 许可。我只想要某些用户( user.access_level < 2 )能够查看员工名单。在我的Permissions类中,如何区分对 list 查看和 get 项目视图。这是我的权限类:

    class CanViewAndEditStaff(permissions.BasePermission):
    
            def has_permission(self, request, view):
    
                # IF THIS IS A LIST VIEW, CHECK ACCESS LEVEL
                if ( request.user.access_level < 3 ):
                    return True
    
                # ELSE, CONTINUE ON TO OBJECT PERMISSIONS
    
            def has_object_permission(self,request,view,account):
    
                # admin can do anything
                if ( request.user.access_level == 1 ):
                    return True
    
                # view/edit/delete
                else:
    
                    # users can view their own account
                    if  account == request.user:
                        return True
    
                    elif account.access_level >= request.user.access_level:
                        return True
    
                return False
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   Ykh    6 年前
    class CanViewAndEditStaff(permissions.BasePermission):
    
        def has_permission(self, request, view):
    
            # IF THIS IS A LIST VIEW, CHECK ACCESS LEVEL
            if (view.action == 'list' and request.user.access_level < 3 ):
                return True
    
            # ELSE, CONTINUE ON TO OBJECT PERMISSIONS
    

    您可以使用view.action来知道这是列表还是其他内容。

        2
  •  0
  •   Thismatters    6 年前

    这不是 确切地 解决这个问题,但是这个技巧是适用的。

    我在ykh的答案中使用了一个变体,它允许在显示各种不同模型的许多视图中广泛使用相同的权限类。

    在我的视图类中,我添加了一个属性来区分原始视图,从而允许适当的对象比较来确定权限

    # views.py
    class SomeView(ListAPIView):
        permission_classes = (IsPermd, )
        is_some_view = True
    
    class SomeOtherView(RetrieveAPIView
        permission_classes = (IsPermd, )
        is_some_other_view = True
    
    # permissions.py
    class IsPermd(BasePermission):
        def has_object_permissions(self, request, view, obj):
            if hasattr(view, 'is_some_view'):
                # whatever special considerations
            if hasattr(view, 'is_some_other_view'):
                # whatever other special considerations
    

    这感觉有点笨拙,但在我找到更好的方法之前,我会坚持下去。