2011-08-18 20 views
6

Tengo una aplicación que hace uso de un custom login module de JBoss. La autenticación puede fallar por una gran variedad de razones y tengo que mostrarlas al usuario en lugar del error Inavlid username/password habitual.JBoss JAAS Módulo de inicio de sesión personalizado Mensajes de error

¿Hay alguna manera de obtener un mensaje de error del mensaje de inicio de sesión? Creo que lo mejor sería a través de una excepción ya que authenticate devuelve un booleano, sin embargo, no puedo encontrar la forma de atraparlo después de la autenticación. Cualquier puntero da la bienvenida.

Respuesta

2

Usted puede utilizar el módulo de inicio de sesión de base de datos y luego obtener la excepción usando

Excepción e = (Excepción) SecurityContextAssociation.getContextInfo ("org.jboss.security.exception");

Puede usar este código dentro de la función administrada de bean para recuperar el mensaje de error ex.

public String getLoginFailureMsg(){ 
     Exception e = (Exception) SecurityContextAssociation. 
            getContextInfo("org.jboss.security.exception"); 
     if(e != null){ 
      if(e.getMessage().contains("PB00019")) 
       return "invalid username"; 
      else 
       return "invalid password"; 
     } 
     return null; 
    } 

para la creación de JAAS con JBoss 7 ver este golpe:

http://amatya.net/blog/implementing-security-with-jaas-in-jboss-as-7/

1

que tenían el mismo problema ..., pero no me gusta que escribe código atado al contenedor por razones obvias .

Entonces, lo que hice fue agregar la excepción a la sesión.

En primer lugar, construir un soporte excepción ThreadLocal para enviar la excepción entre LoginContext y ServletContext:

public final class SecurityThreadLocal { 
private static final ThreadLocal<Exception> j_exception = new ThreadLocal<Exception>(); 

public static void setException(Exception e) { 
    j_exception.set(e); 
} 

public static Exception getException() { 
    return (Exception)j_exception.get(); 
} 

public static void clear() { 
    j_exception.remove(); 
} 

}

Añadir LoginException a SecurityThreadLocal:

catch (Exception e) { // or just catch LoginException 
     log.log(Level.SEVERE, e.getMessage(), e); 
     SecurityThreadLocal.setException(e); 
    } 

Agregar excepción a la HttpSession con a Filtro:

Web.xml

<filter-mapping> 
    <filter-name>SecurityFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    </filter-mapping> 

SecurityFilter.java

if (uri.endsWith("<form-error-page>") && session != null){ 
    Exception j_exception = SecurityThreadLocal.getException(); 
    if(j_exception != null) 
     session.setAttribute("j_exception", j_exception); 
    } 

Pero debe saber que sé que esto es una mala práctica y una grieta de seguridad.

Bien ..., en mi caso, el cliente ganó ...

Cuestiones relacionadas