El libro de Django 1.0

12.5. El resto de detalles: permisos, grupos, mensajes y perfiles

Hay unas cuantas cosas que pertenecen al entorno de autentificación y que hasta ahora sólo hemos podido ver de pasada. En esta sección las veremos con un poco más de detalle.

12.5.1. Permisos

Los permisos son una forma sencilla de "marcar" que determinados usuarios o grupos pueden realizar una acción. Se usan normalmente para la parte de administración de Django, pero puedes usarlos también en tu código.

El sistema de administración de Django utiliza los siguientes permisos:

  • Acceso a visualizar el formulario "Añadir", y Añadir objetos, está limitado a los usuarios que tengan el permiso add para ese tipo de objeto.
  • El acceso a la lista de cambios, ver el formulario de cambios y cambiar un objeto está limitado a los usuarios que tengan el permisos change para ese tipo de objeto.
  • Borrar objetos está limitado a los usuarios que tengan el permiso delete para ese tipo de objeto.

Los permisos se definen a nivel de las clases o tipos de objetos, no a nivel de instancias. Por ejemplo, se puede decir "María puede modificar los reportajes nuevos", pero no "María solo puede modificar los reportajes nuevos que haya creado ella", ni "María sólo puede cambiar los reportajes que tengan un determinado estado, fecha de publicación o identificador".

Estos tres permisos básicos, añadir, cambiar y borrar, se crean automáticamente para cualquier modelo Django que incluya una clase Admin. Entre bambalinas, los permisos se agregan a la tabla auth_permission cuando ejecutas manage.py syncdb.

Estos permisos se crean con el siguiente formato: "<app>.<action>_<object_name>". Por ejemplo, si tienes una aplicación llamada encuestas, con un modelo llamado Respuesta, se crearan automáticamente los tres permisos con los nombres "encuestas.add_respuesta", "encuestas.change_respuesta" y "encuestas.delete_respuesta".

Hay que tener cuidado de que el modelo tenga creada una clase Admin a la hora de ejecutar syncdb. Si no la tiene, no se crearán los permisos. Si has inicializado la base de datos y has añadido la clase Admin con posterioridad, debes ejecutar otra vez syncdb para crear los permisos.

También puedes definir tus propios permisos para un modelo, usando el atributo permissions en la clase Meta. El siguiente ejemplo crea tres permisos hechos a medida:

class USCitizen(models.Model):
    # ...
    class Meta:
        permissions = (
            # Permission identifier     human-readable permission name
            ("can_drive",               "Can drive"),
            ("can_vote",                "Can vote in elections"),
            ("can_drink",               "Can drink alcohol"),
        )

Esto permisos sólo se crearán cuando ejecutes syncdb. Es responsabilidad tuya comprobar estos permisos en tus vistas.

Igual que con los usuarios, los permisos se implementa en un modelo Django que reside en el módulo django.contrib.auth.models. Esto significa que puedes usar la API de acceso a la base de datos para interactuar con los permisos de la forma que quieras.