2015-02-06 62 views
2

我想在JBoss EAP 6.3.2(相當於JBoss AS 7.4.x)中獲得羣集SSO,但我的會話複製工作正常,但SSO(用戶主體複製)在所有情況下都不起作用。JBoss EAP 6.3/AS 7具有不安全頁面的羣集SSO

當我使用具有適當角色的<auth-constraint><security-contraint>內部安全的servlet時,它可以正常工作。

但是,對於未受保護的servlet,直到我第一次訪問受保護的頁面時,SSO纔會起作用,該頁面似乎啓動SSO和infinispan,然後在羣集中找到用戶主體。

這是一個問題,因爲無論您是否登錄,我都有許多頁面的行爲不同。

我有一個狡猾的解決方法,我打電話reauthenticateFromSSOvalve,然而,這不工作,直到後來的請求(我認爲我太晚在鏈中)。我大概可以做一個servlet FORWARD來解決這個問題,但它看起來不太好。

在standalone.xml中,我嘗試在<sso cache-container="web" cache-name="sso" reauthenticate="true"/>行中設置reauthenticate=true,但是,似乎每次我在集羣中的其他服務器上結束時都會導致它註銷。

JBoss內部是否存在一些魔術設置,以便在不需要驗證的頁面上重新驗證SSO?

+0

嘗試實現一個自定義的驗證器調用方法reauthenticateFromSSO,看到的是https://開發商.jboss.org/wiki/AS7EAP6CustomAuthenticatorValves-WritingAnd配置 – 2015-02-09 12:33:10

+0

我今天玩過,似乎在工作,我的問題似乎是因爲我打電話給我在我調用super.invoke之後,重新驗證失敗來自SSO,並且在鏈中已經太晚了。但在調用super.invoke之前,它運行良好。 – 2015-02-09 12:35:39

+0

好的,我前一次遇到同樣的問題,驗證者是解決方案。就我而言,調用順序不是問題(在JBoss 7.1.1中)。 – 2015-02-09 12:48:20

回答

2

感謝@FedericoSierra的一些澄清,在super.invoke(request, response);之前撥打super.reauthenticateFromSSO解決了我的問題。我附上了下面的代碼。

理論上檢查request.getPrincipal() == null && ssoID != null也可能已經足夠。

ClusteredSSOFailoverValve.java

package com.mycompany.valve; 

import java.io.IOException; 

import javax.servlet.ServletException; 

import org.apache.catalina.authenticator.Constants; 
import org.apache.catalina.connector.Request; 
import org.apache.catalina.connector.Response; 

import org.jboss.as.web.security.ExtendedFormAuthenticator; 
import com.yourcompany.framework.Loggers; 

/** 
* Enables Clustered Single Sign On session failover for servlets that don't have any security defined in the web.xml 
*/ 
public class ClusteredSSOFailoverValve extends ExtendedFormAuthenticator { 

    @Override 
    public void invoke(Request request, Response response) throws IOException, ServletException { 
     if (request.getSession(false) != null && request.getPrincipal() == null) { 
      // Try to find the session from Infinispan 
      // The REQ_SSOID_NOTE is set by org.jboss.as.web.sso.ClusteredSingleSignOn.invoke(Request, Response) 
      Object ssoID = request.getNote(Constants.REQ_SSOID_NOTE); 
      if (ssoID != null && ssoID instanceof String) { 
       if (Loggers.securityLogger.isDebugEnabled()) { 
        Loggers.securityLogger 
          .debug("Found SSO Session ID [" 
            + ssoID 
            + "] with a null principal, so will attempt a re-authenticate from SSO to try and retrieve the user principal from the cluster"); 
       } 
       super.reauthenticateFromSSO((String) ssoID, request); 
       if (Loggers.securityLogger.isDebugEnabled()) { 
        Loggers.securityLogger.debug("After re-authenticate from SSO with ssoID [" + ssoID + "], principal is now [" 
          + request.getPrincipal() + "]"); 
       } 
      } 
     } 
     super.invoke(request, response); 
    } 
} 

WEB-INF /的jboss-web.xml中

<?xml version='1.0' encoding='UTF-8' ?> 
<jboss-web> 
    <security-domain>sso</security-domain> 
    <valve> 
     <class-name>com.mycompany.valve.ClusteredSSOFailoverValve</class-name> 
    </valve> 
</jboss-web>