Login Radius con Mensaje de Clave Caducada

PEDRO DELGADO YARZA 2015/10/20 08:49
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.

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 <parent> 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 <parent>. Ejemplo:
  <properties>
      ...
      <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
  </properties>
  • Ahora cambiamos la versión del <parent> a 2.0.14 y realizamos la acción Maven –> Update Project sobre el proyecto principal.

Para aplicaciones FundeWeb 1.5.0, tienen que estar actualizadas al <parent> 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 <parent>. Ejemplo:
  <properties>
      ...
      <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
  </properties>
  • Ahora cambiamos la versión del <parent> 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:

  1. 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).
  2. Desactivamos en Eclipse el Project –> Build Automatically.
  3. 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).
  4. 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.
  5. Mover la clases AuthenticationManagerBean y AuthenticatorAction del paquete org.umu.atica.authentication, al paquete org.umu.atica.seam.security.authentication.
  6. Borrar las clases de los paquetes org.umu.atica.authentication.
  7. Realizar un Maven –> Update Project en Eclipse sobre el proyecto principal.
  8. Volver a importar las dependencias en las clases con fallos de compilación.
  9. Activamos en Eclipse el Project –> Build Automatically.
  10. 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", " " ), "");
       }
    }
  • fdw2.0/login_radius_con_mensaje_de_cuenta_caducada.txt
  • Última modificación: 07/11/2017 10:46
  • (editor externo)