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

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

我已经研究了使用CAS或其他第三方库创建新的Web服务来处理单点登录的各种选项,但似乎没有一个真正满足业务需求。 我当前的实现涉及创建一个新的jar库,它具有AuthenticationProviders的通用实现,以及基于Spring Security的预身份validationfilter 。

在这种方法中,我有多个AuthenticationProviders(当前是Active Directory和Database)供应用程序进行身份validation。 validation成功后,将在包含用户的会话表,过期时间和令牌中插入一行。 令牌也将作为cookie存储在用户的计算机上,并用于validation它们在预认证filter中是否具有当前会话。

从来没有这样做之前我想确保我没有创建一个巨大的安全问题,我也想知道我需要什么来创建令牌? 此时一个简单的GUID似乎足够了?

目前我们正在开发Spring Security 3.0.x,尚未升级到3.1。

提前致谢。

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

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

或者您可能希望查看Java Open Single Sign-On项目

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

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

然后,在每个需要SSO的应用程序上,我实现了一个AbstractPreAuthenticatedProcessingFilter ,并放置在身份validationfilter之前,该filter将cookie拉出并创建一个Authentication对象。 最后,我创建了一个AuthenticationProvider ,用于validationcookie中的信息。

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