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.