lunes, 13 de julio de 2009

sfGuard Plugin

¿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