【问题标题】:Django check user group permissionsDjango检查用户组权限
【发布时间】:2013-05-04 15:56:46
【问题描述】:

我有一个自定义权限,名称 = 'can show distribute page', codename='can_show_distribute_page', contenttype='User' .

我添加了两个组,分别命名为'manager'和'normal',一个有被引用的权限,一个没有。

如何判断用户是否拥有该权限?

我尝试使用 user.has_perm() 方法,但它总是返回 False。

【问题讨论】:

    标签: django permissions


    【解决方案1】:

    正确的做法是在 User 类上使用has_perm。如果这不起作用,请检查以确保两个用户都设置为活动用户。如果这似乎不是问题,请在 shell 中调出每个用户并调用 get_group_permissions 以查看他们通过其组成员身份实际拥有的权限。

    【讨论】:

    • 我确实使用了has_perm方法,当用户有权限的时候效果很好,但是我想让用户在组里,通过他所在的组来判断他是否有权限,如何这样做?
    • has_perm 还会检查用户的组以查看他们是否具有通过组提供的权限。如果您设置正确,这应该可以按预期工作。尝试使用 get_group_permissions 来验证他们确实在具有正确权限的正确组中。
    • 它真的解决了你的问题吗
    【解决方案2】:

    AbstractUserhas_perm 方法(如果您的 User 模型继承自它)实际上会检查,对于您设置的每个身份验证后端,内部 has_perm 函数,代码如下:

    def _user_has_perm(user, perm, obj):
        """
        A backend can raise `PermissionDenied` to short-circuit permission checking.
        """
        for backend in auth.get_backends():
            if not hasattr(backend, 'has_perm'):
                continue
            try:
                if backend.has_perm(user, perm, obj):
                    return True
            except PermissionDenied:
                return False
        return False
    

    所以首先要检查您是否有一个实际检查组权限的授权后端,您可以创建一个自定义的或使用默认的ModelBackend,您可以通过以下键在您的设置中指定它:

    AUTHENTICATION_BACKENDS = [
        'django.contrib.auth.backends.ModelBackend',
    ]
    

    之后,确保将权限传递为与后端使用的格式相同的字符串,在这种情况下,ModelBackend 将其格式化为f"{perm..content_type.app_label}.{perm.codename}

    您的案例的一个工作示例是:

    user.has_perm("app_name.can_show_distribute_page")
    

    【讨论】:

      猜你喜欢
      • 2011-08-14
      • 2014-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      相关资源
      最近更新 更多