【问题标题】:django User permissions and Permission Required Mixindjango 用户权限和所需权限 Mixin
【发布时间】:2017-10-25 10:39:28
【问题描述】:

在这段代码中,Django 将检查元组 permission_required 中的所有权限,以及拥有所有权限的用户是否可以访问视图。如果用户在给定列表或元组中具有任何权限,我想提供视图。例如:在这种特殊情况下,如果用户只有 polls.can_open 权限,我想提供视图

from django.contrib.auth.mixins import PermissionRequiredMixin

class MyView(PermissionRequiredMixin, View)
    permission_required = ('polls.can_open', 'polls.can_edit')

【问题讨论】:

    标签: python django django-1.11


    【解决方案1】:

    django-braces 中的MultiplePermissionsRequiredMixin 是您所需要的。

    文档是here。演示:

    from django.views.generic import TemplateView
    
    from braces import views
    
    
    class SomeProtectedView(views.LoginRequiredMixin,
                            views.MultiplePermissionsRequiredMixin,
                            TemplateView):
    
        #required
        permissions = {
            "all": ("blog.add_post", "blog.change_post"),
            "any": ("blog.delete_post", "user.change_user")
        }
    

    这个视图 mixin 可以通过将强制权限属性设置为 dict 来处理多个权限,其中键为 any 和/或 all 到权限列表或元组。 all 键要求 request.user 具有所有指定的权限。 any 键要求 request.user 至少具有指定权限之一。

    【讨论】:

    • 不满足权限时不提升权限被拒绝。相反,它重定向到登录页面。当该人登录时,有什么方法可以提高权限被拒绝?
    • 当然还要加上redirect_unauthenticated_users=True,因为如果没有登录我们必须重定向。
    【解决方案2】:

    默认情况下,mixin 不支持 OR 条件,但您可以简单地覆盖 has_permission() 方法来自己进行权限检查。比如:

    def has_permission(self):
        user = self.request.user
        return user.has_perm('polls.can_open') or user.has_perm('polls.can_edit')
    

    【讨论】:

    • 最后一行不应该是类似'return any(user.has_perm(p) for p in self.permission_required)' 这样你就可以更笼统,可以是 OrPermissionsRequiredMixin !
    猜你喜欢
    • 2017-10-29
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 2015-02-21
    • 2011-01-28
    • 1970-01-01
    • 2020-01-25
    • 2019-07-13
    相关资源
    最近更新 更多