来自BasePermission的

时间:2017-07-29 07:43:32

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

我希望能够轻松检查某人是postproposal的所有者还是管理员,等等他正在尝试编辑\ delete。

因此,每次我使用IsAuthenticated权限并在ModelViewSet方法中,我都会获得实例并检查instance.author或有时instance.owner是否是请求它的用户( request.user == instance.owner对某些对象request.user == instance.author)。

问题

主要问题是:如何创建可以在实例上使用动态用户属性名称检查此类所有权的权限类?

我的解决方案之一(不是最好的,我认为)

我创建了一个使用户属性实例名返回权限类的函数:

def is_owner_or_admin_permission_factory(owner_prop_name):
    class IsOwnerOrAdmin(BasePermission):
        def has_permission(self, request, view, *args, **kwargs):
            instance = view.get_object()
            try:
                owner = getattr(instance, owner_prop_name)
            except AttributeError:
                return False
            return (
                request.user and request.user.id and (owner == request.user or request.user.is_staff)
            )

    return IsOwnerOrAdmin

1 个答案:

答案 0 :(得分:0)

我几天来一直对同样的问题感到沮丧,当我处理具有不同用户属性查找名称的多个模型时,我设法找到了一个合适的解决方案(当然至少对我而言)

解决方法是这样的,在ModelViewSet中在视图中定义了一个单独的属性user_lookup_kwarg,可用于检查相应的权限。

例如,

class YourViewSet(viewsets.ModelViewSet):
    queryset = YourModel.objects.all()
    serializer_class = YourSerializer
    user_lookup_kwarg = 'user' #or 'account/created_by' whatever.

现在,您的permission_class会有点像这样,

class CustomPermission(BasePermission):

    def has_object_permission(self, request, view, obj):
        try:
            return request.user.is_superuser or getattr(obj, view.user_lookup_kwarg) == request.user
        except:
            pass
        return request.user.is_superuser

您只需要覆盖has_object_permission()方法来检查实例级别权限。