我使用Django Guardian
具有对象级权限和全局权限。有些用户拥有具有全局权限的组,而有些则具有对象级权限.这样,我似乎需要修改PermissionRequiredMixin
以检查对象级别的权限。
views.py
class MainPageView(PermissionRequiredMixin, TemplateView):
permission_required = "app.view_mainpage"
template_name = "web/mainpage.html"
如果用户拥有全局权限,但如果用户在具有对象级权限的组下,则不能使用此权限。使用卫士,要检查对象级权限,还必须传递对象实例。
示例:
self.request.user.has_perm('view_mainpage', obj)
在PermissionRequiredMixin
上,检查只这样进行,self.request.user.has_perms(perms)
因此,如果用户拥有一个具有特定对象的view_mainpage
权限的组,我如何也检查它?顺便说一下,我所有的权限都是相同的content_type
。有什么办法可以让我执行吗?就像我必须将对象实例传递给PermissionRequiredMixin
(如果用户位于对象级别组下)和None
(如果用户位于全局组下)。
发布于 2021-08-18 13:38:17
您可以自己实现这样的混合:
from django.core.exceptions import PermissionDenied
class ObjectPermissionRequiredMixin:
object_permission_required = None
object_permission_denied_message = None
def has_object_permission(self, obj):
return self.request.user.has_perm(self.object_permission_required, obj)
def get_object_permission_denied_message(self):
return self.object_permission_denied_message
def handle_no_object_permission(self):
raise PermissionDenied(self.get_object_permission_denied_message())
def get_object(self, *args, **kwargs):
obj = super().get_object(*args, **kwargs)
if not self.has_object_permission(obj)
return self.handle_no_object_permission()
return obj
然后,您可以将此混合器混合到视图中,例如:
class MyUpdateView(ObjectPermissionRequiredMixin, UpdateView):
model = MyModel
object_permission_required = 'app.update_my_model'
object_permission_denied_message = 'You can not edit this object'
这将适用于所有使用 [Django-doc]的 [Django-doc],如DetailView
、UpdateView
和DeleteView
。
https://stackoverflow.com/questions/68833195
复制相似问题