Trabajo relacionado con Java

29 de Junio de 2007

Gestión de la auditoría con Spring 2.0

Archivado en: Desarrollo — jansoblog @ 9:22 am
Tags: , ,

Spring 2.0 introduce dos nuevos scope para quienes desarrollamos aplicaciones web.
Esta nueva funcionalidad simplifica un trabajo tan arduo como la gestión de auditoría.

Para que el ejemplo quede más claro, como gestión de auditoría vamos a enteder que se indique en el log qué usuario ha realizado una determinada acción.

Realizar esta tarea sin Spring, consistiría principalmente en pasar un nuevo argumento a cada uno de los métodos de la lógica de negocio inidicando el usuario.

Existen otras formas que no voy a discutir, como poner la información en ThreadLocal.

A continuación, indicaré los pasos para crear un bean de sessión en Spring y hacer que un servicio singleton lo reciba, y de esta manera pueda hacer log del usuario y la acción.

Configurar web.xml (fragmento)

<listener> 
<listener-class>
  org.springframework.web.context.request.RequestContextListener
  </listener-class>
 </listener>
 <listener>
  <listener-class>
  org.springframework.web.context.ContextLoaderListener
  </listener-class>
 </listener>

Crear el bean con la información del usuario

package sadiel.rrhhsas.model.comun.objnegocio;
public class UsuarioSession implements Serializable, IUsuario {
String usuario; // Código del usuario
 // getters y setters
  // ..
}

Crear el servicio


package sadiel.rrhhsas.model.adm.usu.service.impl;
public class UsuarioServiceImpl implements IUsuarioService {
IUsuario usuario; //Usuario de session
// the logger for this class
private Log logger = LogFactory.getLog(this.getClass());
/**
  * Valida a un usuario a partir de su usuario y su clave.
  * Introduce el usuario en la session para que sea accesible por otros servicios
  * @param clogin
  * el usuario que usamos
  * @param cclave
  * la clave que usamos
  * @return true
  */
 public boolean login(String clogin, String cclave)
  throws UsernameNotExistException {
// Valido al usuario
  // ...
  // Informo en el usuario de sessión el código del usuario conectado
  usuario.setUsuario(user.getCUsuario());
return true;
}
/**
* @see IUsuarioService#actualizar(Object o)
*/
public void actualizar(Object o) {
this.logger.debug("El usuario "+usuario.getCUsuario() +
" modifica el objeto "+o);

// Resto del servicio
// ..
}
/**
* Set the user in session
* It will be used by the Spring IOC container.
* @param usuario the usuario to set
*/
public void setUsuario(IUsuario usuario) {
this.usuario = usuario;
}
}

Configurar applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="Usuario"
  class="sadiel.rrhhsas.model.comun.objnegocio.UsuarioSession"
  scope="session">
  <aop:scoped-proxy/> <!-- Esto hay que incluirlo en los beans
  con scope="session" si los queremos
  utilizar en otros bean singleton -->
 </bean>
<bean id="iUsuarioService"
  class="sadiel.rrhhsas.model.adm.usu.service.impl.UsuarioServiceImpl" >
  <property name="usuario">
  <ref bean="Usuario" />
  </property>
 </bean>
</beans>Por supuesto si quisieramos que todos los servicios recibieran al usuario, lo que habría que hacer es definir un servicio abstracto y hacer que todos los servicios fueran hijos de este, pero de eso bloquearé otro día.Y eso es todo, algún comentario sería apreciado.

Blog de WordPress.com.