5

Sto cercando di ottenere permessi basati sui ruoli che funzionano per django-nonrel per GAE.Come abilitare le autorizzazioni di gruppo in Django-nonrel per Google App Engine

Fuori dagli schemi, non sembra funzionare, probabilmente a causa della relazione implicita molti a molti tra utenti e gruppi, quindi ho trovato e installato http://www.fhahn.com/writing/Django-s-Permission-System-with-Django-Nonrel. In base alla documentazione, ho aggiunto permission_backend_nonrel a INSTALLED_APPS (dopo djangotoolbox) e ho definito AUTHENTICATION_BACKENDS nella classe appropriata in settings.py.

Questo mi porta oltre il problema precedente ("DatabaseError: questa query non è supportata dal database."), Ma sono ancora bloccato perché quando eseguo un esempio molto semplice, ottengo un set vuoto di autorizzazioni quando Credo che dovrei ottenere qualcosa in cambio. Il seguente è un semplice esempio che potrei fare. Viene lanciato nel framework django da python shell.py shell - è un semplice negozio di pony. Sto cercando di aggiungere un utente a un gruppo, dare che i permessi del gruppo, e poi vedere tali autorizzazioni riflettevano come parte del set di autorizzazioni l'utente ha:

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

Quindi, la domanda è: perché doesn' t il lavoro di cui sopra, e cosa ho bisogno di cambiare per farlo funzionare?

Grazie in anticipo per il vostro aiuto!

risposta

6

Grazie a un collega, ho avuto la risposta a questo. Apparentemente, non avevo bisogno di usare il gruppo incorporato/le autorizzazioni aggiuntive. Utilizzare invece la classe di utilità fornita con * permission_backend_nonrel *

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

Quindi, funziona.

1

Per controllare se un utente è in un gruppo che uso il funzione seguente:

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

ho avuto lo stesso problema, ma risolto modificando l'ordine nell'impostazione AUTHENTICATION_BACKENDS. Il backend di permesso nonrel dovrebbe essere prima del ModelBackend.

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