django集团的许可

时间:2013-05-10 02:28:14

标签: django permissions

我添加了一个名为='can show distribute page'的权限,codename ='can_show_distribute_page',contenttype ='user'。

我添加了两个名为'manager'和'normal'的组,一个拥有权限'can_show_distribute_page'而另一个没有。

现在我添加两个用户,一个添加组'manager',另一个'normal',如何判断用户是否拥有permssion can_show_distribute_page?我尝试使用has_perm方法,但它总是返回False。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

has_permAbstractUser 方法(如果您的 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")