JBoss EAP 6.3 / AS 7具有不安全页面的群集SSO

时间:2015-02-06 08:02:20

标签: java-ee jboss7.x single-sign-on infinispan

我试图让集群SSO在JBoss EAP 6.3.2中工作(相当于JBoss AS 7.4.x),我的会话复制工作正常,但是SSO(用户主体复制)在所有情况下都不起作用。

当我使用在具有<security-contraint>且具有适当角色的<auth-constraint>内安全的servlet时,它可以正常工作。

然而,对于未受保护的servlet,SSO在我第一次访问受保护的页面之前不起作用,该页面似乎启动SSO并且infinispan然后在群集中找到用户主体。

这是一个问题,因为无论您是否登录,我的页面都有不同的行为。

我有一个狡猾的解决方法,我在valve内调用reauthenticateFromSSO,但是在后续请求(我认为我在链中太晚)之前不会工作。我可以做一个servlet FORWARD来解决这个问题,但它似乎很狡猾。

在standalone.xml中,我尝试在reauthenticate=true行中设置<sso cache-container="web" cache-name="sso" reauthenticate="true"/>,但这似乎只会导致每次我在群集中的另一台服务器上注销时退出。

JBoss中是否有一些神奇的设置可以让它在不需要身份验证的页面上重新验证SSO?

1 个答案:

答案 0 :(得分:2)

感谢@FedericoSierra的一些澄清,在super.reauthenticateFromSSO之前致电super.invoke(request, response);解决了我的问题。我附上了以下代码。

理论上,检查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>