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.

martes, 24 de agosto de 2010

Internacionalizacion symfony

Bueno este es mi primer ensayo con la internacionalización, el truco es que podemos poner en diferentes idiomas los titulo mostrados al ejecutar propel:build-admin. yo los voy a poner en español

Lo primero es que hay que distinguir el concepto de cultura de usuario que es un parametro de user de symfony busquen en la web.

Los pasos son los siguientes para poner symfony en español

  • entrar en proyecto/apps/aplicacion/config/ e identificar los archivos routing.yml y settings.yml

  • abrimos el archivo settings.yml y agregamos las siguientes lineas

    all:
    .settings:
    default_culture: es_CO
    i18n: true
    charset: utf-8

    el i18n es para que este activa la internacionalización
    charset es para que permita caracteres especiales como las tildes
    y el default_culture es para poner en español de colombia

  • abrimos el archivo routing.yml y en la parte de abajo en los defaults agregamos la siguiente linea

    default:
    prefix_path: /:sf_culture

    que es para que a todos los modules se les aplique la internacionalización

  • en el action de logueo o incluso en el action de lo primero que visualiza la aplicación agregar lo siguiente

    $this->getUser()->setCulture('es_CO');

  • en la aplicación en la cual se le agregara el idioma se crea una carpeta i18n
    proyecto/apps/aplicacion/i18n/

  • dentro de la carpeta se crea un archivo messages.es.xml

  • finalmente nos salimos de la aplicación y nos volvemos a loguear y listo

para mas información ver http://librosweb.es/symfony_1_0/capitulo13.html


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



Extjs Problema con FormPanel

El Problema consiste en incluir como ítem de un formpanel otro formpanel, y el problema aparece usando el navegador Firefox, no aparece como error en el firebug, sino como de los que no nos gustan, de esos que pareciera que alguien coge nuestro formulario y jugara fútbol con el, jejejejeje, bueno una forma de solucionarlo es dejar un panel con formpanels como items de el y a la hora de cargar los datos sobre el, hacerle el getForm a cada formpanel, no es muy elegante pero funciona y no es muy alto el costo. Ahhh y ultima cosa ni de vainas le van a poner layout: form al panel.