- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用自定义用户模型启动了一个 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/
我一直在学习如何创建自定义 ArrayAdapter 并熟悉重写 ArrayAdapter 的 getViewTypeCount 和 getItemViewType 方法。 为什么 Android V
我是一名优秀的程序员,十分优秀!