我正在尝试让集群 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/