Java JBoss JAAS自定义登录模块错误消息

Java JBoss JAAS自定义登录模块错误消息,java,authentication,jboss,jaas,Java,Authentication,Jboss,Jaas,我有一个应用程序,利用JBoss的。身份验证可能会由于各种原因而失败,我必须向用户显示这些原因,而不是通常的Inavlid用户名/密码错误 有没有办法从登录消息中获取错误消息?我认为最好是通过一个异常,因为authenticate返回一个布尔值,但是我不知道如何在验证后捕获它。欢迎任何指针。使用valveorg.jboss.web.tomcat.security.ExtendedFormAuthenticator,并从会话中抓取j_异常 参考: 您可以使用数据库登录模块,然后使用 异常e=(

我有一个应用程序,利用JBoss的。身份验证可能会由于各种原因而失败,我必须向用户显示这些原因,而不是通常的
Inavlid用户名/密码
错误


有没有办法从登录消息中获取错误消息?我认为最好是通过一个异常,因为authenticate返回一个布尔值,但是我不知道如何在验证后捕获它。欢迎任何指针。

使用valve
org.jboss.web.tomcat.security.ExtendedFormAuthenticator
,并从会话中抓取
j_异常

参考:


  • 您可以使用数据库登录模块,然后使用

    异常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;
        }
    
    要使用JBoss7设置JAAS,请参见以下内容:


    我也有同样的问题…,但出于明显的原因,我不喜欢编写绑定到容器的代码

    因此,我所做的就是将异常添加到会话中

    首先,构建一个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();
     }
    
    使用筛选器将异常添加到HttpSession:

    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);
      }
    
    if(uri.endsWith(“”&&session!=null){
    异常j_Exception=SecurityThreadLocal.getException();
    if(j_异常!=null)
    setAttribute(“j_异常”,j_异常);
    }
    
    但你应该知道,正如我所知道的,这是一种糟糕的做法,是一种安全漏洞

    嗯,在我的情况下,客户赢了

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