【问题标题】:How to get user permissions for non supervisor user by using request user attribute如何使用请求用户属性获取非主管用户的用户权限
【发布时间】:2017-04-09 20:46:51
【问题描述】:

我开发了一个 django 应用程序,它根据资源级别权限注册用户并提供资源在此我在我的模型和模板上使用 django 基本级别权限,为了查看权限,我在我的模型中设置权限元组,例如:

class Model(AbstractUser):
    group = models.ForeignKey(AppGroup)
    class Meta:
        permissions = ( ('view_app', 'user can view app'), )

我在创建我的模型后迁移我的模型。

现在对于权限,我从管理员创建了一个组,并包括所有应用程序查看/更改/删除权限,使用该组我在表单类中生成了一个下拉列表。现在用户(管理员)可以根据选定的权限创建其他用户,成功注册后,新用户能够成功登录并访问所有资源,但是当我尝试访问用户权限时,这是一个多对多关系,使用 like

class UserListView(ListView):
     def get_queryset(self):
         print(self.request.user.user_permissions.all())
         return super(UserListView, self).get_queryset()

当我列出我的视图时,它给了我一个关系错误(500 错误): 关系views_list_user_permission 不存在

现在,当我通过超级用户访问同一个视图时,它会授予我所有权限,但是对于既不是超级用户也不是员工的用户,它会吐出上述错误。通过查看djancgo.contrib.auth.models PermissionMixin 类代码,在我看来 user_permissions m2m 字段只能由超级用户访问,但我对此表示怀疑。所以这就是我正在做的事情并遇到了问题,如果我采取了错误的方式,请纠正我

【问题讨论】:

    标签: django django-templates user-permissions perms


    【解决方案1】:

    超级用户拥有所有被授予的权限。因此,您可以看到所有权限。但是当创建一个新用户时,他将没有任何权限集,因此用户和权限之间没有任何关系,所以您会收到上述错误。

    Note:-
    

    您可以通过使用检查模板内登录用户的可用权限

    {{ perms }}
    

    对于特定应用:-

    {{ perms.app_name }}
    

    对于特定型号:-

    {{ perms.app_name.model_name }}
    

    假设您想授予对特定模型具有特定权限的用户访问视图,您可以使用权限所需的装饰器,如下所示:-

    from django.contrib.auth.decorators import permission_required
    @permission_required('polls.can_vote')
    def my_view(request):
    ...
    

    现在,在“投票”上拥有can_vote 权限的用户将被授予访问权限。

    更详细的使用可以参考:-

    Django documentation on permissions.

    身份验证后端负责用户权限。我猜您正在使用自己的自定义身份验证后端。但是,如果您这样做,您可能忘记了导入 ModelBackend。 from django.contrib.auth.backends import ModelBackend

    现在确保将此后端扩展到您自己的自定义后端

    class EmailBackend(ModelBackend):
    

    【讨论】:

    • 在注册时,我通过user.user_permissions.add(*perms) 向 user_permission 表添加了一些特定权限。在通过 user.user_permissions.all() 访问权限时,它给了我上述错误。这是我不明白的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多