【问题标题】:Make PermissionRequiredMixin also check for object level permission使 PermissionRequiredMixin 也检查对象级别的权限
【发布时间】:2021-10-20 07:08:22
【问题描述】:

我使用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

【问题讨论】:

    标签: django django-permissions django-guardian


    【解决方案1】:

    你可以自己实现这样的混合:

    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

    然后你可以把这个mixin混入一个视图中,例如:

    class MyUpdateView(ObjectPermissionRequiredMixin, UpdateView):
        model = MyModel
        object_permission_required = 'app.update_my_model'
        object_permission_denied_message = 'You can not edit this object'

    这适用于所有使用SingleObjectMixin [Django-doc]Views,例如DetailViewUpdateViewDeleteView

    【讨论】:

    • 成功了!我只是进行了一些更改以从其他来源获取对象,但是此解决方案有效!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2020-01-19
    • 2014-07-19
    • 2018-01-09
    • 2020-05-19
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多