Пользователь Django не наследует разрешение от группы - PullRequest
0 голосов
/ 30 января 2019

Рассмотрим следующий вывод сеанса оболочки Django:

>>> 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 не получает разрешения.Что я делаю не так?

Редактировать: пользовательский тестма активен.

Редактировать2:

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

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Я понял это.Разрешение, которое автоматически добавляется в модель, называется «создать _...», но разрешение, которое вы добавляете на сайте администратора, называется «добавить _...».Так что

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

Странно, правда.Мне не имеет смысла иметь разные имена для них.

0 голосов
/ 30 января 2019

Попробуйте убедиться, что имена разрешений правильно составлены:

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...