2016-04-01 14 views
1

私はHttp Requestの元のURLを覚えておいて、このリクエストをWebフォームにリダイレクトしてユーザー認証を行う必要があります。認証に成功した場合は、先ほど記憶したoriginal URLにリダイレクトする必要があります。 は私がJBoss 7.1.1 Final、標準web.xmlを使用して、とJBossログインモジュールorg.jboss.security.auth.spi.DatabaseServerLoginModuleています:JBossのカスタムServerAuthModuleを実装する

しかし、私の解決策をimpltementingた後、私のカスタムServerAuthModuleは全く呼び出されません。さらに悪いことに、私はサーバーからHttpResponseを取得しませんでした。何か壊れてしまった、助けてください!

マイweb.xml

 <security-constraint> 
      <web-resource-collection> 
       <web-resource-name>All resources in /pages/*</web-resource-name> 
       <description>All resources in /pages/*</description> 
       <url-pattern>/pages/*</url-pattern> 
       <http-method>GET</http-method> 
       <http-method>POST</http-method> 
      </web-resource-collection> 
      <auth-constraint> 
       <role-name>general</role-name> 
      </auth-constraint> 
     </security-constraint> 

     <security-constraint> 
      <display-name>Restrict direct access to the /resources folder.</display-name> 
      <web-resource-collection> 
       <web-resource-name>The /resources folder.</web-resource-name> 
       <url-pattern>/resources/*</url-pattern> 
      </web-resource-collection> 
      <auth-constraint /> 
     </security-constraint> 

     <login-config> 
      <auth-method>FORM</auth-method> 
      <form-login-config> 
       <form-login-page>/login.jsf</form-login-page> 
       <form-error-page>/loginFailed.jsf</form-error-page> 
      </form-login-config> 
     </login-config> 

     <security-role> 
      <role-name>general</role-name> 
     </security-role>  

私のjboss-web.xmlの:

<?xml version="1.0" encoding="UTF-8"?> 
    <jboss-web> 
     <security-domain>jBossJaasMysqlRealm</security-domain> 
     <valve> 
      <class-name>org.jboss.as.web.security.jaspi.WebJASPIAuthenticator</class-name> 
     </valve> 
    </jboss-web> 

マイstandalone.xml

<security-domain name="jBossJaasMysqlRealm" cache-type="default"> 
       <authentication-jaspi> 
        <login-module-stack name="lm-stack"> 
         <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required"> 
          <module-option name="dsJndiName" value="java:/MySqlDS_IamOK"/> 
          <module-option name="principalsQuery" value="select password from user where username=?"/> 
          <module-option name="rolesQuery" value="select role, 'Roles' from user_role where username=?"/> 
         </login-module> 
        </login-module-stack> 
        <auth-module code="at.alex.ok.web.utils.RequestMarkerServerAuthModule" login-module-stack-ref="lm-stack"/> 
       </authentication-jaspi> 
      </security-domain> 

マイカスタムWebServerAuthModule

import org.jboss.as.web.security.jaspi.modules.WebServerAuthModule; 

    public class RequestMarkerServerAuthModule extends WebServerAuthModule { 

     public static final String ORIGINAL_URL = "originalURL"; 

     protected static final Class[] supportedMessageTypes = new Class[] { 
       HttpServletRequest.class, HttpServletResponse.class }; 


     public void initialize(MessagePolicy reqPolicy, MessagePolicy resPolicy, 
       CallbackHandler cBH, Map opts) throws AuthException { 

      System.out.println(this.getClass().getName() + ".initialize() called"); 
     } 

     public Class[] getSupportedMessageTypes() { 
      return supportedMessageTypes; 
     } 

     public AuthStatus validateRequest(MessageInfo msgInfo, Subject client, 
       Subject server) throws AuthException { 
      try { 
       System.out.println(this.getClass().getName() + ".validateRequest() called"); 

       processAuthorizationToken(msgInfo, client); 
       return AuthStatus.SUCCESS; 

      } catch (Exception e) { 
       AuthException ae = new AuthException(); 
       ae.initCause(e); 
       throw ae; 
      } 
     } 

     private void processAuthorizationToken(MessageInfo msgInfo, Subject s) 
       throws AuthException { 

      HttpServletRequest request = (HttpServletRequest) msgInfo 
        .getRequestMessage(); 

      String originalURL = request.getRequestURL().toString(); 
      request.getSession().setAttribute(ORIGINAL_URL, originalURL); 
     } 


     public AuthStatus secureResponse(MessageInfo msgInfo, Subject service) 
       throws AuthException { 

      System.out.println(this.getClass().getName() + ".secureResponse() called"); 

      return AuthStatus.SEND_SUCCESS; 
     } 

     public void cleanSubject(MessageInfo msgInfo, Subject subject) 
       throws AuthException { 
      System.out.println(this.getClass().getName() + ".cleanSubject() called"); 

    } 

} 
+1

のJBoss 7.1.1とJASPICれます友人はいません。 –

答えて

-1

成功したログイン後に最初に要求されたURLにリダイレクトする場合は、JBossのカスタムServerAuthModuleを実装する必要はありません。

インターフェイスjavax.servlet.RequestDispatcherには、FORWARD_REQUEST_URI定数があります。これは、元の要求URIが転送された要求のプロセッサで利用可能になるHttp-Request属性の名前を示します。次のようにJSF 2.2と表示スコープのバッキングBeanのLoginBeanを使用して

は、私の解決策は、バッキングBeanの@PostConstructメソッドで最初に要求されたURLを取得し、セッション属性に保存するだけである:

@ManagedBean(name="loginBean") 
@ViewScoped 
public class LoginBean { 

    private String originalURL; 

    @PostConstruct 
    private void init() { 
     ExternalContext extCtx = FacesContext.getCurrentInstance().getExternalContext(); 

     String origURL = (String) extCtx.getRequestMap().get(RequestDispatcher.FORWARD_REQUEST_URI); 

     HttpServletRequest request = (HttpServletRequest) extCtx.getRequest(); 
     HttpSession session = (HttpSession)extCtx.getSession(false); 

     if (session == null){ 
      session = (HttpSession)extCtx.getSession(true); 
     } 

     if (origURL!=null && session.getAttribute(ORIGINAL_URL) == null){ 
      String applicationName = request.getContextPath(); 
      origURL = origURL.substring(applicationName.length(), origURL.length()); 
      session.setAttribute(ORIGINAL_URL, origURL); 
     } 
    } 

そして、同じバッキングBeanのlogin()メソッドでは、このような成功したログインの場合に本来要求されたURLにユーザーをリダイレクト:

public String login() { 

    HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest(); 

    try { 
     request.login(this.getLogin(), this.getPassword()); 
    } catch (ServletException e) { 
     // handle bad username/password here 
    } 

    return this.originalURL + "?faces-redirect=true"; 
} 
関連する問題