gpt4 book ai didi

python - 为什么管理站点不关心我的自定义用户的权限?

转载 作者:太空宇宙 更新时间:2023-11-04 05:14:17 26 4
gpt4 key购买 nike

我使用自定义用户模型启动了一个 Django (1.10.3) 项目,该模型继承自 AbstractBaseUser。开发这个东西几个星期后,我发现我需要为管理员用户提供更精细的权限,所以我使用 PermissionsMixin 扩展了我的用户模型,生成并应用了迁移,并更新了我的 ModelAdmin.

为了尝试一下,我使用我的 super 用户登录到管理员并创建了一个新用户,并手动添加了所有权限。当我用那个新用户登录时,我看到了一个友好的“您无权编辑任何内容”

所以我去了 shell,检查了我的用户权限,他们在那里。

>>> u = User.objects.get(username='new_user')
>>> u.get_all_permissions()
{'admin.add_logentry', ...}

但是,

>>> u.has_perm('admin.add_logentry')
False

现在,如果用户不是活跃的 super 用户,has_perm 所做的就是调用它:

def _user_has_perm(user, perm, obj):
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

但是,

>>> from django.contrib.auth import get_backends
>>> backend = get_backends()[0] # django.contrib.auth.backends.ModelBackend
>>> backend.has_perm(u, 'admin.add_logentry')
True

所以,

为什么 user.has_perm(perm)backend.has_perm(user, perm) 返回不同的值?最后,我如何才能让权限系统在这种情况下正常工作?

最佳答案

我应该为这个问题的实际答案感到羞愧。至少我希望能从中吸取教训。或许我可以根据 “始终首先检查您自己的实现” 添加一些内容到我的 bug 修复启发式方法中。

这两种方法显然不可能返回不同的东西,这让我检查我是否真的在调用它们。事实证明,我完全忘记了我自己的 has_perm 实现,这是我为了让用户模型与管理员兼容而故意创建的。当然,此实现仅检查 super 用户状态。

我认为奥卡姆的家伙说到点子上了。

关于python - 为什么管理站点不关心我的自定义用户的权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42161923/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com