3

我有一个自定义权限,名称='可以显示分发页面',代号=' can_show_distribute_page ',内容类型='用户'。

我添加了两个组,分别名为“经理”和“正常”,一个具有引用权限,一个没有。

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

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

4

2 回答 2

4

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

于 2013-05-10T06:28:50.127 回答
0

(如果您的 User 模型继承自它)的has_perm方法AbstractUser实际上会检查您设置的每个身份验证后端的内部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")
于 2021-01-19T12:16:11.007 回答