【问题标题】:Django DRF - Restrict Access to List View via PermissionsDjango DRF - 通过权限限制对列表视图的访问
【发布时间】:2018-12-24 13:20:25
【问题描述】:

我有一个 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

【问题讨论】:

    标签: python django python-3.x permissions django-rest-framework


    【解决方案1】:
    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 来了解这是列表还是其他内容。

    【讨论】:

    • 如果他使用GenericViewSet 或其view 的子类,那么self.action 可用于区分视图方法。否则,他必须使用request.method t区分请求方法
    • 对于这些古玩,可用的操作是create、retrieve、update、'partial_update、destroy 和 list
    【解决方案2】:

    这并没有完全解决问题,但这种技术是适用的。

    我使用了 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
    

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

    【讨论】:

      猜你喜欢
      • 2014-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多