Django用户没有从组继承权限

2024-09-30 03:26:02 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑一下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:

^{pr2}$

Tags: 用户testobjectsstepgroupallcanqueryset
2条回答

我想出来了。自动添加到模型中的权限称为“创建…”,但在管理站点中添加的权限称为“添加…”。所以

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

不过,很奇怪。对我来说有不同的名字是没有意义的。在

请尝试此操作以确保权限名称的构造正确:

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缺少权限。在

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

^{pr2}$

相关问题 更多 >

    热门问题