Django用户不继承组的权限

时间:2019-01-30 13:44:05

标签: python django authentication

考虑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组的成员。用户测试不是站点管理员,而是Testmanager中的用户。组Testmanager对模型TestPlanStep具有所有权限。然而,用户的testma没有获得许可。我在做什么错了?

编辑:用户测试已激活。

Edit2:

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

2 个答案:

答案 0 :(得分:0)

尝试执行此操作,以确保正确构造权限名称:

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')

答案 1 :(得分:0)

我知道了。自动添加到模型的权限称为“ create _...”,但您在管理站点中添加的权限称为“ add _...”。所以

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

但是很奇怪。我对这些名称取不同的名字没有道理。