2011-08-18 16 views
6

Ho un'applicazione che utilizza uno custom login module di JBoss. L'autenticazione può fallire per una vasta gamma di motivi e devo visualizzarli all'utente al posto del solito errore Inavlid username/password.JBoss JAAS Modulo di login personalizzato Messaggi di errore

C'è un modo per ottenere un messaggio di errore dal messaggio di accesso? Penso che il meglio sarebbe passare attraverso un'eccezione poiché l'autenticazione restituisce un valore booleano, tuttavia non riesco a capire come ottenerlo dopo l'autenticazione. Qualsiasi suggerimento accoglie.

risposta

2

È possibile utilizzare il modulo di login di database e quindi ottenere l'eccezione utilizzando

Exception e = (Exception) SecurityContextAssociation.getContextInfo ("org.jboss.security.exception");

È possibile utilizzare questo codice nella funzione di bean gestito per recuperare il messaggio di errore es.

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; 
    } 

per la creazione di JAAS con Jboss 7 vedono questo colpo:

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

1

Ho avuto lo stesso problema ..., ma non mi piace scrivendo il codice legato al contenitore per ovvie ragioni .

Quindi quello che ho fatto è stato aggiungere l'eccezione alla sessione da solo.

In primo luogo, costruire un supporto un'eccezione ThreadLocal per inviare l'eccezione tra il LoginContext e 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(); 
} 

}

Aggiungi LoginException a SecurityThreadLocal:

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

Aggiungi eccezione alla HttpSession con un 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); 
    } 

Ma si deve sapere come so che questo è una cattiva pratica e una fessura di sicurezza.

Bene .., nel mio caso il cliente ha vinto ...

Problemi correlati