我添加了一个名为='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。
答案 0 :(得分:1)
执行此操作的正确方法是在User类上使用has_perm
。如果这不起作用,请检查以确保两个用户都设置为活动状态。如果这似乎不是问题,请打开shell中的每个用户并致电get_group_permissions
以查看他们通过群组成员身份实际拥有的权限。
答案 1 :(得分:0)
has_perm
的 AbstractUser
方法(如果您的 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")