【问题标题】:DRF get_permissions doesn't appear to work correctlyDRF get_permissions 似乎无法正常工作
【发布时间】:2019-01-19 02:30:22
【问题描述】:

我正在尝试为我的自定义 User 模型配置权限,并且我正在使用 Viewset 为模型运行 CRUD 操作。根据操作,我需要设置不同的权限要求,例如:

  • 任何人都可以create 一个新的User 实例
  • 只有所有者或管理员可以retrieveupdate 用户

由于某种原因,当我在我的类中定义 get_permissions 方法时,如下所示:

def get_permissions(self):
    if self.action == 'create':
        return [AllowAny(),]

    elif self.action == 'me':
        return [IsAuthenticated(),]

    return [IsAuthenticated(), IsOwnerOrAdmin()]

但是当我导航到 /api/v1/users/ 时,DRF 资源管理器没有显示创建新 User 的表单并给我一个 403 错误。另一方面,当我注释掉这个函数时,我可以正确地看到表单,但显然不能那样使用它。

作为参考,我的自定义 IsOwnerOrAdmin 权限类如下所示:

class IsOwnerOrAdmin(permissions.BasePermission):

    @staticmethod
    def _is_admin(request):
        return request.user.is_superuser

    def has_permission(self, request, view):
        try:
            is_owner = str(request.user.id) == view.kwargs.get('pk')

            return is_owner or self._is_admin(request)

        # if request.user.uuid is not there (i.e. AnonymousUser)
        except AttributeError:
            return False

这可能是什么问题?

【问题讨论】:

    标签: python django permissions django-rest-framework


    【解决方案1】:
    class IsOwnerOrAdmin(BasePermission):
        @staticmethod
        def _is_admin(request):
            return request.user.is_superuser
    
        def has_object_permission(self, request, view, obj):
            return obj == request.user or self._is_admin(request)
    

    【讨论】:

    • 不,仍然出现同样的错误。使用现有的 has_permission 方法和单独尝试了这个,仍然没有。还有其他想法吗?
    猜你喜欢
    • 2017-09-04
    • 2012-05-06
    • 2013-02-17
    • 2017-10-09
    • 2017-08-03
    • 2014-05-02
    • 2011-09-11
    • 2016-02-11
    • 1970-01-01
    相关资源
    最近更新 更多