【问题标题】:Concurrent session control with Spring Security + CAS SSO in multi nodes setup?在多节点设置中使用 Spring Security + CAS SSO 进行并发会话控制?
【发布时间】:2017-04-05 12:48:57
【问题描述】:

以下是我的应用程序的部署配置。没有为 webapp1 和 webapp2 配置集群,也没有为 CAS1 和 CAS2 配置集群。我完全依赖会话粘性来确保来自最终用户的流量始终由同一台服务器提供服务,但是我确实在 CAS1 和 CAS2 之间配置票证复制以保证 SSO 正常工作:

VIP1 +-- webapp1 --+ VIP2 +- CAS1  
     |             |      |
     +-- webapp2 --+      +- CAS2

我看到很多文章/博客描述了如何使用 Spring Security 实现并发会话控制,以下是我想到的问题。

1) 我想验证一下我对 Spring Security 和 CAS SSO 的并发会话控制的理解,所以我们假设我们没有 webapp2 和 CAS2。根据我的理解,必须确认 webapp 的 spring security 和 CAS 用户才能成功登录 webapp。 Webapp 的 Spring Security 是通过在其安全上下文中添加身份验证来确认的,而 CAS 是通过添加 TGC cookie 来确认的。
如果我对 webapp 和 CAS 应用并发会话控制(使前一个无效),并且当 UserA 和 UserB 使用相同的登录名时,应该会发生以下情况:
1.1) UserA 已成功通过身份验证,因此他从 CAS 接收 cookie 并在 webapp 的 spring 安全上下文中留下身份验证。
1.2) 由于UserB使用的是同一个登录名,是第二次登录,CAS会使UserA失效。
1.2) 当 webapp 的 spring security 确认登录已通过身份验证并发现这是第二次相同的登录被身份验证时,webapp 的 spring security 使 UserA 无效。
1.3)当UserA尝试访问webapp时,webapp的spring security将UserA重定向到CAS。
1.4) CAS判断UserA带来的cookie无效,要求UserA再次输入登录凭证。

那么这是正确的吗?

2) 说我的理解是正确的,我们把webapp2 和CAS2 放回去,而不是像开头所说的那样进行聚类。如果 UserA 由 webapp1 和 CAS1 提供服务,而 UserB 由 webapp2 和 CAS2 提供服务,我想在这种情况下并发会话控制将不起作用,我需要实现自定义 SessionRegistryImpl、ConcurrentSessionControlStrategy 和 ConcurrentSessionFilter,对吗?

感谢您的宝贵时间。

【问题讨论】:

    标签: spring session spring-security cas


    【解决方案1】:

    我只使用过预身份验证 CAS,其中 CAS 添加了一个带有身份验证信息的标头,然后您可以针对 CAS/LDAP 进行解析。

    您的分析看起来是正确的,通过查看 javaDoc 和源代码,您就快到了。

    • 您需要一个自定义的SessionRegistry,以便您拥有一个全球位置来跟踪会话(Hazelcast 或数据库)。
    • 您需要 ConcurrentSessionControlStrategy 来检查是否达到并发会话的限制。
    • 您将需要 ConcurrentSessionFilter,因此会话已过期的用户将被注销。

    另外你需要在AbstractAuthenticationProcessingFilter上设置RegisterSessionAuthenticationStrategy,因为默认是NullAuthenticatedSessionStrategy,这意味着SessionRegistry不会被调用创建会话。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-28
      • 2011-03-17
      • 2019-01-23
      • 2021-04-18
      • 2014-09-22
      • 2016-08-16
      • 1970-01-01
      相关资源
      最近更新 更多