在没有 Apache 的 Tomcat 服务器上使用 JAAS 进行 SSO。SSO 控制对几个相关应用程序的访问,效果很好。最近我开始从 Ant 迁移到 Maven,为了使用 Maven 的 Tomcat 插件,我需要设置我以前不需要的 Tomcat Manager 应用程序。我能够通过 BASIC 身份验证或 CLIENT-CERT 身份验证以及服务器上的其他 webapps 来启动并运行它。
我遇到的问题是当用户在管理器中进行身份验证时,其他 webapps 的会话被丢弃 - IE 登录到 webapp,登录到管理器,刷新 webapp,重定向到登录页面。
我能够通过在上下文级别定义 SSO 阀和在主机级别定义领域来减轻这种重叠。这仍然允许 SSO 在通过浏览器在 web 应用程序之间导航时工作。但是,跨上下文 AJAX 请求和诸如此类的返回“用户未登录”错误,直到我访问其他有问题的 web 应用程序。使用这种方法对 Manager 进行身份验证有效地与其他 webapp 隔离。
简而言之,我正在寻找使用 JAAS 身份验证模块为我的 webapps 提供通过 SSL/数据库身份验证的 SSO 的最佳方式,但强制 Tomcat 从 SSO 中排除 Manager。IE SSO 通过 SSL 用于 Webapps 1、2、3,但 UN/PW 身份验证独立于 Manager 的 SSO,两者之间的身份验证独立。
有没有办法做到这一点?
当前配置:
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="false"
xmlValidation="false" xmlNamespaceAware="false">
<Realm className="org.apache.catalina.realm.JAASRealm" appName="CustomLogin"
userClassNames="com.foo.bar.User" roleClassNames="com.foo.bar.Role"
useContextClassLoader="true" debug="false"/>
<Valve className="org.apache.catalina.authenticator.SingleSignOn"/>
<Context path="/Webapp1" docBase="webapp1">
<ResourceLink name="jdbc/WEBAPP" global="jdbc/WEBAPP" type="java.sql.DataSource"/>
</Context>
<Context path="/Webapp2" docBase="webapp2">
<ResourceLink name="jdbc/WEBAPP" global="jdbc/WEBAPP" type="java.sql.DataSource"/>
</Context>
<Context path="/Webapp3" docBase="Webapp3">
<ResourceLink name="jdbc/WEBAPP" global="jdbc/WEBAPP" type="java.sql.DataSource"/>
</Context>
<Context path="/manager" docBase="manager" AntiJARLocking="false" antiResourceLocking="false" privileged="true" reloadable="false">
<Realm className="org.apache.catalina.realm.MemoryRealm"></Realm>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="manager_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
</Context>
</Host>
</Engine>
使用此配置,所有 webapps 和管理器都在 SSO 的控制之下,并且发生了上述重叠 - IE 通过 SSL 登录到 webapp1,然后通过 UN/PW 管理器,然后刷新 webapp1,重定向到登录页面。
将 SSO 阀移动到 webapps 的上下文可以解决此问题,但会导致跨上下文 AJAX 请求的“用户未登录”响应。