====== Login Radius con Mensaje de Clave Caducada ====== --- //[[pedrody@um.es|PEDRO DELGADO YARZA]] 2015/10/20 08:49//\\ --- //[[juanmiguelbg@um.es|JUAN MIGUEL BERNAL GONZALEZ]] 2015/10/27 18:34// Tras las modificaciones por parte de Telemática del servicio Radius, ahora podemos saber si una clave concreta está caducada o a punto de caducar para un usuario. Con esta información se ha añadido un nuevo método al //ServicioRadiusUmu// para que notifique al usuario cuando su cuenta está a punto de caducar. ===== Aplicaciones FundeWeb 2.0 ===== En las aplicaciones FundeWeb 2.x el cambio es transparente siempre y cuando se esté utilizando la librería para login por Radius que trae por defecto cualquier aplicación FundeWeb. Siempre y cuando la aplicación este actualizada al //// versión 2.0.14, sino esta actualizada, tenéis que seguir los siguientes pasos: * Abrimos el POM principal y seleccionado la pestaña //Effective POM//, ahora tenéis que buscar la propiedad //project.build.sourceEncoding//. Si la codificación es //UTF-8//, no tenéis que hacer nada. Pero si la codificación es //ISO-8859-1// tenéis que añadir en el POM principal la propiedad //project.build.sourceEncoding// antes de modificar la versión del ////. Ejemplo: ... ISO-8859-1 * Ahora cambiamos la versión del //// a 2.0.14 y realizamos la acción //Maven --> Update Project// sobre el proyecto principal. ===== Aplicaciones FundeWeb 1.5.0 ===== Para aplicaciones FundeWeb 1.5.0, tienen que estar actualizadas al //// versión 1.5.13, sino esta actualizada, tenéis que seguir los siguientes pasos: * Abrimos el POM principal y seleccionado la pestaña //Effective POM//, ahora tenéis que buscar la propiedad //project.build.sourceEncoding//. Si la codificación es //UTF-8//, no tenéis que hacer nada. Pero si la codificación es //ISO-8859-1// tenéis que añadir en el POM principal la propiedad //project.build.sourceEncoding// antes de modificar la versión del ////. Ejemplo: ... ISO-8859-1 * Ahora cambiamos la versión del //// a 1.5.13 y realizamos la acción //Maven --> Update Project// sobre el proyecto principal. Ahora tenemos que seguir los siguientes pasos para actualizar la versión de la actualización por Radius: - Hemos añadido la autenticación múltiple en la librería //FundeWeb Seam Components 5.1.14// (al igual que pasa con FundeWeb 2.0).\\ - Desactivamos en Eclipse el //Project --> Build Automatically//. - Borrar la clase //UmuIdentity// del paquete //org.umu.atica.security//, recordad que si habéis añadido información adicional a dicha clase, entonces tendréis que meterla en la clase //Identity// especifica de la aplicación (en principio, si la clase esta como cuando se migro a Weblogic, no hace falta tocar nada).\\ - Mover la clases //UmuIdentityLoader// y //UmuPermissionStore// del paquete //org.umu.atica.security// (recordad modificar la configuración del fichero //components.xml//), al paquete //org.umu.atica.seam.security//.\\ - Mover la clases //AuthenticationManagerBean// y //AuthenticatorAction// del paquete //org.umu.atica.authentication//, al paquete //org.umu.atica.seam.security.authentication//.\\ - Borrar las clases de los paquetes //org.umu.atica.authentication//.\\ - Realizar un //Maven --> Update Project// en Eclipse sobre el proyecto principal.\\ - Volver a importar las dependencias en las clases con fallos de compilación.\\ - Activamos en Eclipse el //Project --> Build Automatically//. - Testear la aplicación.\\ Calendario de disponibilidad de la librería //FundeWeb Seam Components 5.1.14//:\\ - Entorno local desde el 30/10/2015\\ - Entorno de desarrollo desde el 02/11/2015\\ - Entorno de test desde el 02/11/2015\\ - Entorno de producción desde el 05/11/2015\\ Puesto que la caducación masiva de cuentas es el 03/11/2015, se puede utilizar este método alternativo, donde debemos modificar manualmente nuestro método de autenticación según la siguiente especificación. Método usado hasta ahora boolean autentica(String usuario, String password, String aplicacion); Método que se ha de usar a partir de ahora /** * * @param usuario * @param password * @param aplicacion * @return devuelve RespuestaRadius compuesto por un codigo y un mensaje. * Si es 0 el usuario está autenticado. * Si es 1 el usuario no ha pasado la autenticación * Si es 2 se ha producido una excepción */ public RespuestaRadius autenticaConMensaje( String usuario, String password, String aplicacion ); La clase RespuestaRadius public class RespuestaRadius implements Serializable{ private static final long serialVersionUID = 5771177141809085695L; private String codigo; private String mensaje; public RespuestaRadius( String codigo, String mensaje ) { this.codigo = codigo; this.mensaje = mensaje; } public String getCodigo() { return codigo; } public void setCodigo( String codigo ) { this.codigo = codigo; } public String getMensaje() { return mensaje; } public void setMensaje( String mensaje ) { this.mensaje = mensaje; } } Por lo tanto ahora tendremos que llamar al método autenticaConMensaje y tratar los casos según el mensaje recibido, al mismo tiempo tendremos que notificar el mensaje al usuario, por lo tanto un ejemplo completo de cómo se podría rehacer la autenticación sería: public boolean authenticate() { String usuario = getIdentity().getCredentials().getUsername(); LOG.info( "Autenticando a: #0", usuario ); if ( !UtilString.esCadenaVacia( usuario ) && !usuario.contains( "@" ) ) { usuario += "@um.es"; } try { RespuestaRadius respuesta = getServicioRadiusUmu().autenticaConMensaje( usuario,getIdentity().getCredentials().getPassword(), this.getApplicationName().toUpperCase() ); // Si tenemos respuesta y el codigo es 0 (login OK) if ( respuesta != null && "0".equals( respuesta.getCodigo() ) ) { this.loadPersonaByUsuario( usuario ); processOkMessage( respuesta ); return true; } else { return false; } } catch ( ServiceNotFoundException snfe ) { LOG.error( "Error al buscar el servicio: ServicioRadiusUmu", snfe ); } catch ( PersonaException pe ) { LOG.error( "Error: al obtener los datos del Usuario en GENTE.", pe ); processErrorMessage(); } catch ( PersonaNotFoundException pnfe ) { LOG.error( "Error: el usuario no se encuentra en GENTE.", pnfe ); processErrorMessage(); } return false; } //Añado el mensaje a la cola de mensajes para que le salga al usuario protected void processOkMessage(RespuestaRadius respuesta){ if(!UtilString.esCadenaVacia( respuesta.getMensaje() )){ this.getStatusMessages().add(Severity.WARN, null, null, respuesta.getMensaje().replaceAll( "\n", " " ), ""); } }