¿Qué es sfGuard?
Es un plugin que da la posibilidad de usar en cualquier aplicación ACL (Access Control List por sus siglas en Inglés) o lo que es lo mismo autorización y autenticación. Es una capa más de seguridad por encima de la seguridad predefinida por Symfony haciendo uso del modelo usuarios, grupos y permisos. El mismo es desarrollado y soportado en su totalidad por Fabien Potencier creador de Symfony.
Instalación
Gracias a las herramientas que nos provee Symfony instalar el plugin es algo sencillo. Abrimos una consola y ejecutamos el siguiente comando:
$ symfony plugin:install sfGuardPlugin
Para realizar la instalación de los plugins Symfony usa PEAR así que debemos tenerlo previamente configurado. En caso de que no tengamos instalado y/o configurado PEAR siempre existen alternativas para poder realizar la instalación.
Veamos una de ellas y es la que más uso porque a veces me da un poco de lata configurar PEAR y la conexión a Internet u otros. Descargamos el archivo correspondiente a la versión de Symfony que tenemos instalada (ver al final del documento los enlaces estables del plugin en el momento de escribir el artículo). En mi caso es la versión 1.2.7. Por tanto usamos el tercer enlace Symfony 1.2.x. Descomprimimos el fichero en el directorio /plugins de nuestro proyecto. Nos debe quedar una carpeta llamada sfGuardPlugin-3.1.3. Renombramos dicha carpeta a sfGuardPlugin.
El próximo paso es reconstruir el modelo.
$ symfony propel:build-model
$ symfony propel:build-sql
$ symfony propel:insert-sql
$ symfony propel:build-forms
$ symfony propel:build-filters
Al ejecutar dichas tareas estamos recreando las clases del modelo, recreando las clases para trabajo con formularios, recreando las clases que permiten filtrar los contenidos, creando el fichero .sql que contiene las consultas referentes al esquema de sfGuardPlugin y ejecutando dicha consulta directamente en nuestra Base de Datos por lo cual las tablas quedarán creadas. SfGuardPlugin viene con un fichero de fixtures o lo que es lo mismo con datos de prueba que pueden ser adicionados. Para usar el fichero vamos al directorio /plugins/sfGuardPlugin/data y renombramos el fichero fixtures.yml.sample a fixtures.yml. Luego con la tarea:
$ symfony propel:data-load
insertamos el contenido del fichero fixtures.yml a las tablas previamente creadas. Para evitar la ejecución de cada una de las tareas anteriores de forma independiente Symfony posee la tarea: propel:build-all-load por lo cual si ejecutamos la misma es como si estuvieramos ejecutando las 5 tareas anteriores más una 6ta tarea que no ejecutamos: propel:insert-sql.
$ symfony propel:build-all-load
-------------------------------------------------------------------------------------
$ symfony propel:build-model
$ symfony propel:build-sql
$ symfony propel:insert-sql
$ symfony propel:build-forms
$ symfony propel:build-filters
$ symfony propel:data-load
Cuando usamos la tarea anterior los datos contenidos en la BD se pierdan pero Symfony es un framework de exelencia por lo cual toma en cuenta muchas cosas. A la tarea anterior se le pueden pasar ciertos parámetros y uno de ellos evita la pérdida de datos anteriores.
$ symfony propel:build-all-load --append
De igual forma existen otros parámetros de configuración para esa tarea. Si quieren echarle un ojo ejecuten en una consola el siguiente comando:
$ symfony help propel:build-all-load
Hasta aquí hemos creado las bases para poder usar el plugin pero aún quedan cosas por hacer.
Activando los módulos adecuados en las aplicaciones
Por lo general una aplicación web consta de una interfaz administrativa (backend) y una interfaz de usuario (frontend). Los módulos de sfGuardPlugin deben ser activados teniendo en cuenta de que interfaz es. Para la interfaz de usuario debemos activar el módulo: sfGuardAuth (autorización, autenticación) en el fichero /apps/frontend/config/settings.yml.
all:
.settings:
enabled_modules: [default, sfGuardAuth]
Para la interfaz administrativa debemos activar los módulos: sfGuardAuth (autorización, autenticación), sfGuardUser (administración de usuarios), sfGuardGroup (administración de grupos), sfGuardPermission (administración de permisos) en el fichero /apps/backend/config/settings.yml.
all:
.settings:
enabled_modules: [default, sfGuardAuth, sfGuardGroup, sfGuardPermission, sfGuardUser]
Limpiamos la cache:
$ symfony cc
Creando el usuario por defecto
Si usaste la tarea antes comentada propel:build-all-load entonces puedes omitir este epígrafe pues ya los usuarios, grupos y permisos iniciales están creados.
sfGuardPlugin dispone de una tarea adicional para crear los usuarios desde la línea de comandos: guard:create-user.
$ symfony guard:create-user reynierpm m7con6tr9se0a
Esto inserta un usuario en la BD el cual puede ser usado posteriormente.
Asegurando las aplicaciones
Para asegurar nuestra aplicación debemos hacer, nuevamente, los siguientes cambios en los ficheros /apps/frontend/config/settings.yml y /apps/backend/config/settings.yml.
all:
.settings:
login_module: sfGuardAuth
login_action: signin
secure_module: sfGuardAuth
secure_action: secure
Cambiamos la clase padre en el fichero /apps/nombre_aplicacion/lib/myUser.class.php
class myUser extends sfGuardSecurityUser
{
}
Opcionalmente se pueden añadir las siguientes rutas al fichero /apps/nombre_aplicacion/config/routing.yml
sf_guard_signin:
url: /login
param: { module: sfGuardAuth, action: signin }
sf_guard_signout:
url: /logout
param: { module: sfGuardAuth, action: signout }
sf_guard_password:
url: /request_password
param: { module: sfGuardAuth, action: password }
Yo siempre los añado pero como dije anteriormente es totalmente opcional. Se recomienda añadir una ruta “@homepage” para cuando el usuario inicie o termine sesión.
all:
sf_guard_plugin:
routes_register: false
success_signin_url: @homepage
success_signout_url: @homepage
La ruta debe estar definida en el fichero routing.yml
homepage:
url: /
param: { module: reservacion, action: index }
Ahora solo nos resta asegurar la aplicación completa o módulos o inclusive acciones específicas. Veamos el ejemplo para asegurar una aplicación completa con todos sus módulos y luego una para asegurar solo 2 o 3 módulos.
Si vamos a asegurar la aplicación completa entonces editamos el fichero /apps/nombre_aplicacion/config/security.yml y ponemos lo siguiente:
default:
is_secure: on
Si lo que queremos es asegurar es un módulo específico entonces creamos el fichero /apps/nombre_aplicacion/nombre_modulo/config/security.yml (Symfony no lo crea por defecto por lo que debes hacerlo a mano) y escribimos lo mismo que antes:
default:
is_secure: on
Limpiamos la cache nuevamente:
$ symfony cc
Ya hemos asegurado la aplicación.
Accediendo a los módulos de administración
Para acceder a los módulos que nos permiten administrar los usuarios, grupos y permisos podemos hacerlo de la siguiente forma:
Usuarios: http://www.example.com/nombre_aplicacion/sfGuardUser
Permisos: http://www.example.com/nombre_aplicacion/sfGuardPermission
Grupos: http://www.example.com/nombre_aplicacion/sfGuardGroup
Esto es todo para esta entrega. En próximos números estaremos abordando temas como:
Usando un perfil de usuario con sfGuard
Cómo usar autenticación contra dominios LDAP
Cómo extender el plugin para añadir funcionalidades
Personalizando las plantillas usadas por el plugin
Añadiendo acciones