我希望能够轻松检查某人是post
,proposal
的所有者还是管理员,等等他正在尝试编辑\ 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
答案 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()
方法来检查实例级别权限。