5

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

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

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

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

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

提前致谢。

4

2 回答 2

2

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

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

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

于 2012-10-28T15:16:55.970 回答
2

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

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

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

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

于 2013-05-21T13:35:41.190 回答