如何将自定义值从DRF ModelViewSet传递到权限类?

时间:2020-05-20 01:09:28

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

我已经设置了custom permissions class,以便在某些用户代表其他用户拥有类所有权的应用中从多个视图重用:

class IsOwnerLike(permissions.BasePermission):
    def has_permission(self, request, view):
        if (
            user_is_owner(request.user, request.data["owned_by"])
            | user_is_owner_like(request.user, request.data["owned_by"])
        ):
            return True

        return False

这对于一个ModelViewSet可以正常工作。

但是,由于遗留原因,进入不同视图的不同请求可能没有“ own_by”数据元素-可能被称为“ owned”,“ owner”,“ created_by”等,因此我无法按书面形式重复使用此自定义权限。

在视图集上抽象事物以规范传递给我的自定义权限类的数据的正确方法是什么?可以做到这一点,还是我应该考虑以不同的方式处理这些权限?

2 个答案:

答案 0 :(得分:1)

找到了解决方案。

我能够向视图添加自定义属性:

class ViewOne(ModelViewSet):
    ownership_fieldname = "owned_by"
    permission_classes = [IsOwnerLike]

    ...

class ViewTwo(ModelViewSet):
    ownership_fieldname = "owner"
    permission_classes = [IsOwnerLike]
    ...

然后在权限中访问它:

class IsOwnerLike(permissions.BasePermission):
    def has_permission(self, request, view):
        if (
            user_is_owner(request.user, request.data[view.ownership_fieldname])
            | user_is_owner_like(request.user, request.data[view.ownership_fieldname])
        ):
            return True

        return False

答案 1 :(得分:0)

您应使用has_object_permission中的对象检查模型访问权限,如下所示:

    def has_object_permission(self, request, view, obj):
        if hasattr(obj, 'owner'):
           if obj.user == request.user:
              return True
        return False

您可以使用模型所有者字段名称更改所有者

对于将类所有者传递给权限类,您应该编写custommModelViewSet并从ModelViewSet继承并重写get_permissions()方法