2011-01-24 23 views

Respuesta

102

Supongo que la primera pregunta que debe hacer es qué permisos necesita y de qué tipo. Por qué tipo, quiero decir, ¿quieres nivel de modelo o de objeto? Para aclarar la diferencia, di que tienes un modelo de automóvil. Si desea otorgar permisos en todos los automóviles, entonces el nivel de modelo es apropiado, pero si desea otorgar permisos por automóvil, quiere el nivel de objeto. Puede necesitar ambos, y esto no es un problema, como veremos.

Para permisos de modelo, Django maneja estos para usted ... principalmente. Para cada modelo, Django creará permisos con el formato 'appname.permissionname_modelname'. Si tiene una aplicación llamada 'controladores' con el modelo de automóvil, entonces uno de los permisos sería 'drivers.delete_car'. Los permisos que crea automáticamente Django serán crear, cambiar y eliminar. Por alguna extraña razón, decidieron no incluir los permisos de lectura de CRUD. Tendrás que hacer esto tú mismo. Tenga en cuenta que Django decidió cambiar la "actualización" de CRUD por "cambiar" por algún motivo. Para añadir más permisos a un modelo, digamos permisos de lectura, se utiliza la clase Meta:

class Car(models.Model): 
    # model stuff here 
    class Meta: 
     permissions = ( 
      ("read_car", "Can read Car"), 
     ) 

Tenga en cuenta que los permisos es un conjunto de tuplas, donde los elementos de tupla son el permiso como se describió anteriormente y una descripción de ese permiso . No tiene que seguir la convención permname_modelname, pero generalmente me apego a ella.

Por último, para comprobar los permisos, puede utilizar has_perm:

obj.has_perm('drivers.read_car') 

Dónde obj es un usuario o grupo de instancia. Creo que es más fácil de escribir una función para esto:

def has_model_permissions(entity, model, perms, app): 
    for p in perms: 
     if not entity.has_perm("%s.%s_%s" % (app, p, model.__name__)): 
      return False 
    return True 

Dónde entidad es el objeto de comprobar los permisos en (grupo o usuario), el modelo es el ejemplo de un modelo, permanentes es una lista de permisos como cadenas para comprobar (por ejemplo ['leer', 'cambiar']), y la aplicación es el nombre de la aplicación como una cadena. Para hacer lo mismo cheque como has_perm anterior que se dice algo como esto:

result = has_model_permissions(myuser, mycar, ['read'], 'drivers') 

Si es necesario utilizar los permisos de objetos o fila (que significan la misma cosa), entonces Django no puede realmente ayudar por sí mismo . Lo bueno es que puede usar los permisos de modelo y objeto uno al lado del otro. Si desea permisos de objetos, tendrá que write your own (si usa 1.2+) o encontrar un proyecto que alguien más ha escrito, uno que me gusta es django-objectpermissions desde washingtontimes.

+21

Esta es una gran respuesta para los permisos, pero apenas toca a los grupos y cómo funcionan en Django. – Simon

+3

No hay mucho para los grupos, en su mayoría son solo para agrupar a los usuarios para aplicar permisos, al igual que los grupos de usuarios de Linux. Le das permiso a un grupo y se extiende a todos los miembros de ese grupo. La documentación lo dice todo realmente: https://docs.djangoproject.com/en/dev/topics/auth/default/#groups. –

+0

Parece que Django Advent se ha ido, hay una versión del artículo sobre cómo escribir sus propios permisos de objetos en Github: https://github.com/djangoadvent/djangoadvent-articles/blob/master/1.2/06_object-permissions.rst –

Cuestiones relacionadas