Posts Tagged ‘Java’

h1

Pasar un método como parámetro a un composite component de JSF

27 agosto 2010

En una aplicación para el trabajo (aún no he conseguido escapar de las garras de JSF 😦 ) necesitaba que, cuando un usuario fuese a salir de una página de edición, se le notificase mediante un cuadro de diálogo que perdería los cambios sin guardar. Como había bastantes salidas posibles (botones, elementos de menú…) decidí crear el diálogo en un composite component. Por si a alguien le interesa, para el diálogo en sí utilicé la biblioteca PrimeFaces 2.1, basada en jQuery UI.

Evidentemente, cada salida tenía un destino diferente: en el caso de los elementos de menú cada uno dirigía a una parte distinta de la aplicación. Por ello, necesitaba pasar como parámetro del componente la acción a ejecutar.
Sin embargo, esto no es que esté precisamente documentado de manera muy espléndida en ninguna parte, pero encontré la solución gracias a un tutorial en IBM DeveloperWorks.

Debemos definir nuestro componente al menos con el contenido del siguiente cuadro, donde he simplificado mi situación (en lugar de un diálogo de confirmación solo hay un botón) para que se vea de forma más obvia la solución 🙂

<cc:interface>
  <cc:attribute name="actionMethod" 
                required="true"
                method-signature="java.lang.String action()" />
</cc:interface>
<cc:implementation>
  <h:commandButton value="¡Púlsame!"
                action="#{cc.attrs.actionMethod}" />
</cc:implementation>

En la interfaz se debe definir un atributo que evalúe a un método; lo he llamado “actionMethod”. Importante: En el atributo method-signature se debe proporcionar la declaración de tipos completa, como en java.lang.String.

Con esto ya podemos invocar el componente desde cualquier página con:

<lib:componente actionMethod="#{controlador.accion}" />
h1

Encriptar la contraseña de conexión en hibernate.cfg.xml

5 febrero 2010

Por defecto, en el fichero de configuración de Hibernate se muestran en texto plano todos los datos de conexión, lo que evidentemente no resulta muy seguro en cuanto lo ponemos a disposición de los usuarios. Para encriptarlos de manera sencilla podemos utilizar la biblioteca Jasypt (Java Simplified Encryption), que también nos permite encriptar el contenido de la base de datos, aunque eso queda fuera del alcance de este post 🙂

En este caso, supongamos que solo vamos a encriptar la contraseña. Lo primero es generar este valor a partir de una clave mediante uno de los scripts BAT o SH que se incluyen en la distribución. Ejecutamos la orden encrypt.bat input=contraseña_a_encriptar password=clave_del_algoritmo y nos devolverá un resultado como el siguiente:

----ENVIRONMENT-----------------
Runtime: Sun Microsystems Inc. Java HotSpot(TM) Client VM 14.2-b01
----ARGUMENTS-------------------
input: mipass
password: foobar
----OUTPUT----------------------
j1BNruKrxJ9xy9u8e1GtBw==

El valor de salida será el que se escriba en el fichero hibernate.cfg.xml, pero antes nos quedan cosas por hacer. En el fichero donde esté mapeada la base de datos (en caso de usar anotaciones habrá que crear uno nuevo) incluimos la declaración del tipo del cifrador:

<hibernate-mapping>
      <typedef name="encrypted"
      class="org.jasypt.hibernate.type.EncryptedStringType">
            <param name="encryptorRegisteredName">
                  hibernateEncryptor</param>
      </typedef>
</hibernate-mapping>

En la clase donde se cree la SessionFactory de Hibernate (lo habitual es utilizar una llamada HibernateUtil) se asocia esta al cifrador antes declarado:

config = new AnnotationConfiguration().configure();

PBEStringEncryptor encryptor =
      new StandardPBEStringEncryptor();
// La clave se puede obtener consultar en web,
// en una variable del programa o de entorno...
encryptor.setPassword("foobar");
HibernatePBEEncryptorRegistry registry =
      HibernatePBEEncryptorRegistry.getInstance();

// Asignar el mismo nombre que en hibernate-mapping
registry.registerPBEStringEncryptor(
      "hibernateEncryptor", encryptor);

sessionFactory = config.buildSessionFactory();

Y ya es hora de tocar el fichero de configuración de Hibernate, añadiendo las siguientes líneas. Es importante escribir la contraseña encriptada entre paréntesis porque es el formato que utiliza Jasypt para diferenciar las cadenas encriptadas de las que viajan en plano.

<!-- Proveedor más simple de conexión encriptada,
también existe uno sobre C3P0 -->
<property name="connection.provider_class">
      org.jasypt.hibernate.connectionprovider.EncryptedPasswordDriverManagerConnectionProvider
</property>
<property name="connection.encryptor_registered_name">
      hibernateEncryptor
</property>
<property name="connection.password">
      ENC(j1BNruKrxJ9xy9u8e1GtBw==)
</property>

<!-- Fichero con el hibernate-mapping -->
<mapping resource="mapping.xml" />

Y con estos pocos pasos habremos mejorado un poquito la seguridad de nuestra aplicación 😀