5

Estoy tratando de obtener permisos basados ​​en roles que funcionen para django-nonrel para GAE.Cómo hacer que los permisos de grupo funcionen en Django-nonrel para Google App Engine

Fuera de la caja, no parecía funcionar, probablemente debido a la relación implícita muchos-a-muchos entre Usuarios y Grupos, así que encontré e instalé http://www.fhahn.com/writing/Django-s-Permission-System-with-Django-Nonrel. De acuerdo con la documentación, agregué permission_backend_nonrel a INSTALLED_APPS (después de djangotoolbox) y definí AUTHENTICATION_BACKENDS a la clase apropiada en settings.py.

Esto me permite superar el problema anterior ("DatabaseError: esta consulta no es compatible con la base de datos."), Pero todavía estoy atascado porque cuando ejecuto una muestra muy simple, obtengo un conjunto vacío de permisos cuando Creo que debería recuperar algo. El siguiente es un ejemplo tan simple como podría hacer. Se lanzó en el framework django mediante el shell python manage.py, es una simple tienda de pony. Estoy tratando de agregar un usuario a un grupo, que dar permisos de grupo, y luego ver esos permisos reflejados como parte del conjunto de permisos que el usuario tiene:

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

Entonces, la pregunta es: ¿Por qué doesn' el trabajo anterior, y ¿qué necesito cambiar para que funcione?

Gracias de antemano por su ayuda!

Respuesta

6

Gracias a un colega, obtuve la respuesta a esto. Aparentemente, no necesitaba usar el grupo incorporado/permiso agrega. En su lugar, use la clase de utilidad que viene 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) 

Entonces, funciona.

1

Para comprobar si un usuario está en un grupo utilizo el siguiente función:

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

yo tenía el mismo problema, pero resuelto cambiando el orden en el entorno AUTHENTICATION_BACKENDS. Permiso back-end norel debe estar antes del ModelBackend.

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