Django中,当user_permissions被设置时,user get_all_permissions()为空

30

我通过管理员界面为用户添加了一些权限。

但出现了某些原因导致所有的权限函数都失败,例如:

>>> user.get_all_permissions()
set([])

但是直接访问表格就可以工作:

>>> user.user_permissions.all()
(list of permissions as expected)
什么因素可能导致"get_all_permissions"(以及所有像has_perm()这样的权限函数)失败?
谢谢。

2
你的settings.py中有哪些身份验证后端? - satoru
2个回答

50

我也遇到了同样的问题。我猜想你曾经使用过自己编写的AUTHENTICATION_BACKEND?大多数在网上找到的例子(包括Django 1.0文档!)没有提到后端还负责权限处理。

不过这没什么大不了的:无论你的代码在哪个后端文件中,都要包含这个导入:

from django.contrib.auth.backends import ModelBackend

然后确保您编写的后端 扩展 ModelBackend,例如:

class EmailBackend(ModelBackend):

应该没问题。


是的,我后来发现了。我修改了后端以支持不区分大小写的用户名,并破坏了权限。 - Boris

1

在我的情况下,这是因为权限缓存。我获取用户,将权限添加到user.user_permissions中,但是user.get_all_permissions为空的set()user.has_permFalse。这个问题只出现在shell中而不是管理员界面。

user = User.objects.get(username="User")

permission = Permission.objects.get(
    codename="organizations.add_organization",
)
user.user_permissions.add(permission)

user.get_all_permissions()  # set()
user.has_perm('organizations.add_organization')  # False

在检查权限之前,我必须添加额外的行:

user.user_permissions.add(permission)

user = User.objects.get(username="User") # new

user.get_all_permissions()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接