【问题标题】:Django user does not inherit permission from groupDjango 用户不从组继承权限
【发布时间】:2019-06-23 19:35:31
【问题描述】:

考虑以下 Django shell 会话的输出:

>>> from django.contrib.auth.models import User, Group
>>> g=Group.objects.all()
>>> g
<QuerySet [<Group: Tester>, <Group: Testmanager>]>
>>> g[1].permissions.all()
<QuerySet [..., <Permission: testman | test plan step | Can add test plan step>, <Permis
sion: testman | test plan step | Can change test plan step>, <Permission: testman | test plan step |
 Can delete test plan step>, <Permission: testman | test plan step | Can view test plan step>, ...]>
>>> g[1].user_set.all()
<QuerySet [<User: somedude>, <User: testma>]>
>>> u=User.objects.all()
>>> u
<QuerySet [<User: somedude>, <User: test>, <User: testma>]>
>>> u[0].has_perm('testman.create_testplanstep')
True
>>> u[2].has_perm('testman.create_testplanstep')
False

我定义了两个组,Tester 和 Testmanager。用户 somedude 是站点管理员,也是 Testmanager 组的成员。用户 testma 不是站点管理员,而是在 Testmanager 中。组 Testmanager 拥有模型 TestPlanStep 的所有权限。然而用户 testma 没有获得许可。我做错了什么?

编辑:用户 testma 处于活动状态。

编辑2:

>>> u[2].username
'testma'

【问题讨论】:

  • 用户testma是否活跃?
  • 你能确定u[2].username 是“testma”吗?

标签: python django authentication


【解决方案1】:

尝试这样做以确保正确构造权限名称:

g = Group.objects.all()
perms = g[1].permissions.all()
us = g[1].user_set.filter(is_active=True)
missingperms = set()
for u in us:
    for p in perms:
        pstring = p.content_type.app_label + '.' + p.codename
        if not u.has_perm(pstring):
            missingperms.add(pstring)
print('missing permissions count:', len(missingperms))

输出应该是 0 缺少权限。

附录: 超级用户拥有特定权限这一事实并不能证明该权限是有效的。例如,你可以试试这个:

u = User.objects.filter(is_superuser=True)[0]
u.has_perm('burn_down_the_house')

【讨论】:

    【解决方案2】:

    我想通了。自动添加到模型的权限称为“create_...”,但您在管理站点中添加的权限称为“add_...”。所以

    >>> u[2].has_perm('testman.add_testplanstep')
    True
    

    不过很奇怪。给它们起不同的名字对我来说没有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多