Django检查用户组权限

3

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

我添加了两个组,名为 'manager' 和 'normal',其中一个有引用的权限,另一个没有。

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

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

2个回答

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

1
我确实使用了 has_perm 方法,当用户拥有权限时它可以正常工作,但是我想让用户在组内,并通过他所在的组来判断他是否有权限,应该如何做? - Roger Liu
has_perm 还会检查用户所在的组是否拥有该权限。只要设置正确,它就应该按预期工作。尝试使用 get_group_permissions 来验证他们确实在正确的组中具有正确的权限。 - Thomas
它实际上解决了你的问题吗? - Thomas

1
如果您的用户模型继承自AbstractUser,则has_perm方法实际上会检查您设置的每个认证后端的内部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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接