【发布时间】:2019-12-03 07:48:37
【问题描述】:
我们有两个应用程序(abc 和 def)在 Struts2 中开发并与 CAS 服务器 3.2 集成以实现 SSO,部署在多个主机 (IP) 上。该部署架构图如下。 SSO 在以下部署中运行良好,没有问题。
我们部署了相同的两个 CAS 客户端(abc 和 def),具有多个实例(tomcat 端口为 8080 和 8081 ) 在同一主机上。请参阅下面的部署架构图。使用此 SSO 无法正常工作,单点登录工作正常,但当用户从 abc 应用程序注销时(它在 Host2 的 8081 端口上运行)然后会话过期请求将转到 def 应用程序(它在 Host2 的 8080 端口上运行)。此用户未从 def 应用程序(其在 Host2 的 8081 端口上运行)注销(会话未过期)。
可能这是我也不知道的愚蠢问题。如何解决这个问题。任何人都请帮助我。在以上两种情况下,URL 是相同的http://domain.in/abc/login.do 或http://domain.in/def/login.do
更新:
从 abc 中注销,仍然登录应用程序 def。
看起来您正在尝试在这里实现某种集群?
是的。我想实现所有 CAS 客户端的单次注销。但在这里它没有发生。如上所述,注销命令正在发送到其他实例。
您是否在相同的节点之间进行会话复制 应用设置?
粘性会话。
您如何将来自客户端(或来自 CAS)的流量路由到 单个应用节点?
负载均衡器
【问题讨论】:
-
这个问题很难回答。我建议您调试 CAS 服务器库以查看用户从应用程序注销时会发生什么。如果激活了单点注销过滤器,则用户从应用程序注销后 AFAIK,CAS 服务器将注销命令发送到所有其他应用程序。
-
@Spara,你说的是完全正确的。 CAS 服务器正在向所有应用程序(abc 和 def)发送注销命令。没关系。但是它在 8081 上向 abc 和 8080 上的 def 发送注销命令。但实际上它应该是 8081 上的 def。
-
看起来你想在这里实现某种集群?那时我不会对所描述的行为感到惊讶。您如何将来自客户端(或来自 CAS)的流量路由到各个应用程序节点?您是否在同一应用程序设置的节点之间进行会话复制?我想如果您想要一个有效的单点注销,则需要将注销一个节点传播到其他节点。但这不是CAS服务器要解决的问题。也许只是尝试以更易读的方式描述您的问题...
-
或者,您很可能使用sticky sessions。然后你可以尝试CAS documentation中描述的“前通道”。
-
@PetrBodnár 如何实现 SLO。我只是通过上面链接中的文档。但我没有完全理解。
标签: java spring struts2 cas single-logout