77 votos

¿Cómo utilizo Django grupos y permisos.

Entiendo la materia básica de usuario. Sé autenticación de inicio de sesión, creación de cuentas, etc.. Pero ahora quiero trabajar en grupos y permisos.

¿Dónde está la documentación para grupos/permisos de django? Esto no es así: http://docs.djangoproject.com/en/dev/topics/auth/

115voto

Alex Kuhl Puntos 953

Supongo que la primera cuestión que hay que hacer son ¿qué permisos se necesitan y de qué tipo. Por qué tipo, me refiero a ¿desea Modelo - o de nivel de Objeto. Para aclarar la diferencia dicen que usted tiene un modelo de Coche. Si quieres dar permisos en todos los autos, entonces el Modelo es adecuado, pero si quieres dar permisos por el coche de base que desea a nivel de Objeto. Usted puede necesitar tanto, y esto no es un problema como veremos.

Para el Modelo de permisos, Django se encarga de estos para usted... en su mayoría. Para cada modelo de Django va a crear permisos en la forma " appname.permissionname_modelname'. Si usted tiene una aplicación llamada 'drivers' con el modelo del Coche, a continuación, un permiso sería 'los conductores.delete_car'. Los permisos que Django crea automáticamente será crear, modificar y eliminar. Por alguna extraña razón se decidió no incluir los permisos de lectura de CRUD, tendrá que hacerlo usted mismo. Tenga en cuenta que Django decidió cambiar CRUD 'actualizar' para 'cambiar' por alguna razón. Para añadir más permisos a un modelo, por ejemplo permisos de lectura, el uso de la Meta de la clase:

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 la tupla de elementos que son el permiso de como se describió anteriormente y una descripción de ese permiso. Usted no tiene que seguir el permname_modelname convención, pero normalmente me pega con él.

Finalmente, para comprobar los permisos, puede utilizar has_perm:

obj.has_perm( 'drivers.read_car' )

Donde obj es un Usuario o Grupo de instancia. Creo que es más sencillo 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

Donde la entidad es el objeto de comprobar los permisos (de Grupo o de Usuario), es el modelo de instancia de un modelo, permanentes es una lista de permisos como cadenas de verificación (por ejemplo, ['leer', 'cambiar']), y la app es el nombre de la aplicación como una cadena. Para hacer la misma comprobación como has_perm de arriba que se llama algo como esto:

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

Si usted necesita usar un objeto o una fila de permisos (significan lo mismo), entonces Django no puede realmente ayudar a usted por sí mismo. Lo bueno es que se puede utilizar tanto en el modelo y el objeto de los permisos de lado a lado. Si desea permisos de objeto tendrá que escribir su propio (si se usa 1.2+) o encontrar un proyecto en el que alguien ha escrito, uno que me gusta es la de django-objectpermissions de washingtontimes.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X