我有一个自定义权限,名称为 'can show distribute page',codename='can_show_distribute_page',contenttype='User'。
我添加了两个组,名为 'manager' 和 'normal',其中一个有引用的权限,另一个没有。
如何判断用户是否具有该权限?
我尝试使用user.has_perm()方法,但它总是返回False。
我有一个自定义权限,名称为 'can show distribute page',codename='can_show_distribute_page',contenttype='User'。
我添加了两个组,名为 'manager' 和 'normal',其中一个有引用的权限,另一个没有。
如何判断用户是否具有该权限?
我尝试使用user.has_perm()方法,但它总是返回False。
has_perm
。如果这不起作用,请确保两个用户都设置为活动状态。如果那似乎不是问题,请在 shell 中将每个用户提起并调用 get_group_permissions
查看他们通过组成员身份实际拥有的权限。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")