2011-08-18 66 views
6

我有一個應用程序使用JBoss的custom login module。身份驗證可能因多種原因而失敗,我必須將這些顯示給用戶,而不是通常的Inavlid username/password錯誤。JBoss JAAS自定義登錄模塊錯誤消息

有沒有辦法從登錄消息中獲取錯誤消息?我認爲最好的是通過一個異常,因爲authenticate返回一個布爾值,但是我不知道如何在認證後捕獲它。任何指針都歡迎。

回答

2

您可以使用數據庫登錄模塊,然後讓使用

異常E =(異常)SecurityContextAssociation.getContextInfo異常( 「org.jboss.security.exception」);

您可以在託管bean函數內使用此代碼來獲取錯誤消息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; 
    } 

用來與JBoss 7設置JAAS看到這樣的打擊:

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

1

我有同樣的問題......,但我不喜歡書面方式代碼依賴於容器的原因很明顯。

所以我所做的就是自己添加異常到會話中。

首先,建立一個ThreadLocal例外持有人發送LoginContext對象和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(); 
} 

}

添加LoginException異常到SecurityThreadLocal:

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

添加例外與HttpSession中a過濾器:

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

但是你應該知道,因爲我知道這是一個不好的做法和安全漏洞。

呃..在我的情況下,客戶贏了...