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

标签 jakarta-ee jboss7.x single-sign-on infinispan

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

当我使用被保护在 <security-contraint> 内的 servlet 时,它可以正常工作。有一个 <auth-constraint>具有适当的角色。

但是,对于不 protected servlet,SSO 无法工作,直到我第一次访问 protected 页面,这似乎启动了 SSO,然后 infinispan 在集群中找到用户主体。

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

我有一个狡猾的解决方法,我调用 reauthenticateFromSSO里面 valve ,但是直到后续请求才起作用(我想我在链中太晚了)。我可能可以做一个 servlet FORWARD 来解决这个问题,但它看起来很狡猾。

在standalone.xml中我尝试设置reauthenticate=true<sso cache-container="web" cache-name="sso" reauthenticate="true"/>行,但这似乎导致每次我在集群中的不同服务器上结束时它都会注销。

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

最佳答案

感谢@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>

关于jakarta-ee - 具有不安全页面的 JBoss EAP 6.3/AS 7 集群 SSO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28361108/

相关文章:

tomcat - Jboss 7.1 web 服务器是 Tomcat 吗?如果是这样,它是否具有与 jboss standalone.xml 文件不同的配置文件?

spring-boot - Spring OAuth2 : support auth and resource access with both SSO and custom auth server

facebook - 是否可以检查电子邮件是否在 Facebook 上得到确认?

java - Jersey ResponseBuilder 文件名编码

java - 无法将 CSS 文件链接到 JSP

java - Autowiring Spring 3.1 独立应用程序返回 "No unique bean of type [x.x.x.x] is defined"异常

flash - 使用 Joomla 和 Flash 进行单点登录

java - 将消息安全性从 Glassfish 迁移到 JBoss 7

java-ee-6 - 为什么每次 web 和 ejb 容器之间都会调用 LoginModule?

jakarta-ee - 具有抽象类继承的 JPA 实体