如何使用 Spring Security 跨多个基于 JVM 的应用程序实现单点登录

Posted

技术标签:

【中文标题】如何使用 Spring Security 跨多个基于 JVM 的应用程序实现单点登录【英文标题】:How to implement single sign on across multiple JVM based applications using Spring Security 【发布时间】:2012-10-13 09:10:02 【问题描述】:

我目前正在尝试跨多个基于 JVM(Grails、Servlets)的 Web 应用程序实现单点登录解决方案,这些应用程序当前都部署在同一个 servlet 容器中(目前是 Tomcat,但不想将我的解决方案仅限于 Tomcat) .所有 Web 应用程序共享一个公共数据库。

我查看了各种选项,从使用 CAS 或其他第三方库到创建新的 Web 服务来处理单点登录,但似乎没有一个能真正满足业务。我当前的实现涉及创建一个新的 jar 库,该库具有基于 Spring Security 的 AuthenticationProviders 和 Pre-Authentication Filters 的通用实现。

在这种方法中,我有多个 AuthenticationProviders(当前是 Active Directory 和数据库)供应用程序进行身份验证。成功验证后,将在包含用户、到期时间和令牌的会话表中插入一行。该令牌还将作为 cookie 存储在用户的机器上,用于验证他们在预身份验证过滤器中是否有当前会话。

在我想确保不会造成巨大的安全问题之前从未这样做过,而且我还想知道创建令牌需要什么?此时,一个简单的 GUID 似乎就足够了?

目前我们正在开发 Spring Security 3.0.x,还没有升级到 3.1。

提前致谢。

【问题讨论】:

我会同意 guid 是一个足够的会话 ID。至于安全问题,您有什么顾虑? 我担心的是任何常见的攻击,例如会话欺骗,我可能无法处理。在会话欺骗的情况下,可以通过将 cookie 从用户机器复制到另一台机器来完成,但我相信通过将超时时间设置为合理的水平,可以减轻这种攻击。 网络应用安全陷阱的一个很好的来源是owasp.org/index.php/Main_Page 没错,刚刚删除了答案。 【参考方案1】:

Spring Security Extensions 网站上提供了适用于 KERBEROS、OAuth 和 SAML 的扩展。这是提供示例的博客条目:SpringSource Blog

如果您使用 NTLM 作为 SSO 提供程序,请查看 jespa-spring 项目。

或者你可能想看看Java Open Single Sign-On Project

【讨论】:

这也不能满足我的要求,因为它涉及设置额外的服务器作为权限。我有多个要共享身份​​验证的应用程序,但不想在我的应用程序之外需要任何其他服务器。【参考方案2】:

我最终通过执行以下操作解决了这个问题:

我创建了一个AuthenticationSuccessHandler,它将向用户会话添加一个cookie,该会话具有识别信息和主机名,以尽可能地保护它。 (该应用程序在大多数客户站点内部运行,因此确定这里的风险很小,但要小心 cookie 劫持。)

然后在每个需要 SSO 的应用程序上,我实现了一个AbstractPreAuthenticatedProcessingFilter,并放置在身份验证过滤器之前,该过滤器将提取 cookie 并创建一个身份验证对象。最后,我创建了一个AuthenticationProvider,它验证了来自 cookie 的信息。

希望将来可以帮助其他人处理此类请求。

【讨论】:

以上是关于如何使用 Spring Security 跨多个基于 JVM 的应用程序实现单点登录的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 如何跨 Web 应用程序请求在线程中管理 SecurityContext?

如何使用带有多个过滤器和 Spring Security 的 Spring DelegatingFilterProxy?

使用 Grails 和 Spring Security 进行跨域身份验证

Spring Security:如何在 FilterRegistrationBean 中使用多个 URL 模式?

如何在 Spring WebFlux Security(Reactive Spring Security)配置中将多个用户角色添加到单个 pathMatcher/Route?

Spring Security系列教程解决Spring Security环境中的跨域问题