Как заставить групповые разрешения работать в Django-nonrel для Google App Engine - PullRequest
5 голосов
/ 12 июля 2011

Я пытаюсь получить разрешения на основе ролей, работающие для django-nonrel для GAE.

Из коробки это не сработало, возможно, из-за неявных отношений «многие ко многим» между пользователями и группами, поэтому я нашел и установил http://www.fhahn.com/writing/Django-s-Permission-System-with-Django-Nonrel. Согласно документации,Я добавил allow_backend_nonrel в INSTALLED_APPS (после djangotoolbox) и определил AUTHENTICATION_BACKENDS для соответствующего класса в settings.py.

Это позволяет мне преодолеть предыдущую проблему («DatabaseError: этот запрос не поддерживается базой данных».), но я все еще застрял, потому что когда я запускаю очень простой пример, я получаю пустой набор разрешений, когда считаю, что должен что-то получить обратно.Ниже приведен простой пример, который я мог бы сделать.Он запускается в среде django оболочкой python manage.py - это простой магазин пони.Я пытаюсь добавить пользователя в группу, дать этой группе разрешения, а затем увидеть, что эти разрешения отражены как часть набора разрешений, которыми обладает пользователь:

>>> from django.contrib.auth.models import Group, Permission, User
>>> from django.contrib.contenttypes.models import ContentType
>>> from pony_shop.models import Pony

#Create the group:
>>> farmers = Group(name="Farmers")
>>> farmers.save()

>>> pony_ct = ContentType.objects.get(app_label='pony_shop', model='pony')

#Create the Permission
>>> can_twirl = Permission(name='Can Twirl', codename='can_twirl', content_type=pony_ct)
>>> can_twirl.save()

#Give the Permission to the Group
>>> farmers.permissions.add(can_twirl)
>>> farmers.save()

#Create the User
>>> francis = User(username='francis')
>>> francis.save()

#Put the user in the group
>>> francis.groups.add(farmers)
>>> francis.save()

#Get a pony object
>>> firefly = Pony(price=12, height=3, name='Firefly', color='fuscia')
>>> firefly.save()

>>> francis.get_all_permissions()
set([]) #<-- WHY?!?

#Just in case I needed to check the permissions against a pony object:
>>> francis.get_all_permissions(obj=firefly)
set([]) #<-- Still no joy

Итак, вопрос: почемуне работает вышеперечисленное, и что мне нужно изменить, чтобы это работало?

Заранее спасибо за помощь!

Ответы [ 4 ]

6 голосов
/ 16 июля 2011

Спасибо коллеге, я получил ответ на этот вопрос.Видимо, мне нужно было не использовать встроенную группу / добавление разрешений.Вместо этого используйте служебный класс, который поставляется с *missions_backend_nonrel *

>>>from permission_backend_nonrel import utils
>>>utils.add_permission_to_group(can_twirl,farmers)
>>>utils.add_user_to_group(francis,farmers)

Тогда он работает.

2 голосов
/ 04 января 2012

О, как обновление, вот где новая база кода: https://github.com/django-nonrel/django-permission-backend-nonrel

И там тоже есть инструкции: -)

1 голос
/ 25 мая 2012

Чтобы проверить, входит ли пользователь в группу, я использую следующую функцию:

from django.contrib.auth.models import User, Group
from permission_backend_nonrel.models import UserPermissionList

def UserInGroup(User, groupName):
    group = Group.objects.get(name=groupName)
    up = UserPermissionList.objects.filter(user = User)
    try:
        return True if unicode(group.id) in up[0].group_fk_list else False
    except:
        return False
0 голосов
/ 08 мая 2013

У меня была та же проблема, но я решил, изменив порядок в настройке AUTHENTICATION_BACKENDS. Бэкэнд разрешения не должен быть перед ModelBackend.

AUTHENTICATION_BACKENDS = (
    'permission_backend_nonrel.backends.NonrelPermissionBackend',
    'django.contrib.auth.backends.ModelBackend',
)
...