Este blog esta destinado para la comunidad desarrolladora de software, en el podrán encontrar trucos, atajos o consejos de diferentes lenguajes de programación o frameworks, tanto de tipo desktop como web. Si quieres participar como editor por favor hacerlo saber escribiendo un correo a cualquiera de los editores.

sábado, 21 de agosto de 2010

Seguridad en Symfony

Bueno aunque a un plugin de Symfony (sfGuardPlugin) que ayuda mucho a solucionar el problema, incluyendo gestión de usuarios, credenciales y demás, como para empezar he decidido hacerlo a pie, porque es muy fácil y ademas para aprovechar el modulo de login y de gestión de usuarios que ya estaba hecho.

Bueno la implementación es muy sencilla, basta con agregar unas lineas al archivo security.yml (proyecto/apps/nombreaplicacion/config/security.yml) de nuestra aplicación:

default:
is_secure: true

recuerden conservar los espacios, porque si tabulan... bueno ya sabrán lo que pasa, estas lineas son para pedir que el acceso a los módulos de la aplicación solo puedan ser accedidos por usuarios autenticados, es decir que al momento de validar el usuario sea cual sea la forma en la que lo hagan, recuerden agregar

$this->getUser()->setAuthenticated(true);

de esta forma el usuario estará autenticado y podrá acceder a los módulos de la aplicación.

Bueno, hasta aquí nuestros usuarios del sistema no podrán acceder a nuestra aplicación si nuestro modulo de login se encuentra en el la aplicación que acabamos de proteger, para solucionar estos, conozco hasta ahora dos formas:

  • Crear nuestro modulo de login en otra aplicación.
  • Des proteger el modulo de login de la aplicación asegurada para que pueda ser accedida por usuarios sin autenticar.
Para la primera, si alguien necesita, que comente o me escriba para hacer una entrada explicando como hacer un modulo de login, y para la segunda, debemos crear una carpeta que se llame config dentro de la carpeta del modulo, es decir que quedara acompañada de las carpetas actions y templates de nuestro modulo, e incluir en la carpeta config un archivo llamado security.yml, y en este archivo incluir las siguientes lineas :

default:
is_secure: false

así de esta forma el modulo quedara desprotegido y podrá ser accedido por usuarios no autenticados pues para autenticarse.

Con lo explicado anteriormente también se pueden proteger o des proteger módulos a nivel de aplicación y acciones a nivel de modulo cambiando el default por el nombre de el modulo o la acción que queremos proteger o des proteger.

Otra cosa importante en la seguridad de la aplicación son los roles o credenciales como se llaman en Symfony.

Para hace esto primero autentiquemos a alguien como se dijo anteriormente y ademas agreguemos:

$this->getUser()->addCredential('nombredecredencial', 'valor'); //si necesitamos valores o

$this->getUser()->addCredential('nombredecredencial'); //credencial sencilla

así nuestro usuario tendrá una credencial de acceso a determinados módulos, y para configurar el acceso al modulo con cierta credencial agregamos al security.yml del modulo.

default:
is_secure: true
credentials: nombredecredencial

si necesita solo una credencial, para otras configuraciones de credenciales

credentials: [credencial1, credencial2] // credencial1 and credencial2

credentials: [[credencial1, credencial2]] // credencial1 or credencial2

recuerden que estas configuraciones la pueden hacer tanto a nivel de modulo como de acciones, yo probé hacerlo todo en el security.yml de la aplicación y no funciono, así que me toco ademas configurar el security.yml de algunos módulos.

Hasta aqui tenemos protegidos nuestros módulos por autenticación y por credenciales, pero cuando no puedo acceder? y estoy perdido, lo normal seria que la aplicación me redirigiera hacia el modulo de login, para hacer esto vamos a configurar el archivo settings.yml ubicado en la carpeta config de nuestra aplicación y agregamos o ubicamos las siguientes lineas:

all:
.action:
login_module: nombremodulodelogin
login_action: nombreaccionmostarinterfazlogin //normalmente index

Y por ultimo recordemos des autenticar y limpiar la variables de sesión de la siguiente forma:

$this->getUser()->setAuthenticated(false);
$this->getUser()->clearCredentials();
$this->getUser()->getAttributeHolder()->clear();

RECUERDEN EJECUTAR SYMFONY CC, CUANDO MODIFIQUEMOS CUALQUIER ARCHIVO .YML



No hay comentarios: