我有一个自定义权限,名称='可以显示分发页面',代号=' can_show_distribute_page ',内容类型='用户'。
我添加了两个组,分别名为“经理”和“正常”,一个具有引用权限,一个没有。
如何判断用户是否拥有该权限?
我尝试使用 user.has_perm() 方法,但它总是返回 False。
我有一个自定义权限,名称='可以显示分发页面',代号=' can_show_distribute_page ',内容类型='用户'。
我添加了两个组,分别名为“经理”和“正常”,一个具有引用权限,一个没有。
如何判断用户是否拥有该权限?
我尝试使用 user.has_perm() 方法,但它总是返回 False。
正确的方法是has_perm
在 User 类上使用。如果这不起作用,请检查以确保两个用户都设置为活动用户。如果这似乎不是问题,请在 shell 中打开每个用户并调用get_group_permissions
以查看他们通过其组成员身份实际拥有的权限。
(如果您的 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")