我想要简单的方法来检查是否有人是post
,proposal
等的所有者或管理员,他正在尝试编辑\ delete。Django(drf)动态权限从BasePermission
所以,每次我用IsAuthenticated
许可,并在ModelViewSet
的方法,我得到的实例和时间是否instance.author
或有时是谁要求它(在某些对象是request.user == instance.author
request.user == instance.owner
)的用户。
问题
的主要问题是:我怎么可以创建许可类,它可以检查这种动态用户拥有对实例属性的名字吗?
一矿的解决方案(不是最好的,我认为)
我创建功能需要用户属性实例名称返回权限类:
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
这对我来说完美无缺!再次感谢! – Dionid
有一点:当你检查'request.user.is_superuser'和它的返回'True'时,它将从方法返回,如果它是'False'并且第二个参数产生异常,你可以返回'False',因为'request .user.is_superuser'必须已经是'False'。 – Dionid
另外,我认为最好检查用户是否被授权,因为(在大多数情况下)'AnonymousUser'不能是对象的所有者,所以他需要被授权。 – Dionid