我目前正在尝试跨多个基于 JVM(Grails、Servlet)的 Web 应用程序实现单点登录解决方案,这些应用程序目前都部署在同一个 servlet 容器(当前是 Tomcat,但不想将我的解决方案仅限于 Tomcat)中。所有 Web 应用程序共享一个公共数据库。
我研究了各种选项,从使用 CAS 或其他第三方库到创建新的 Web 服务来处理单点登录,但似乎没有一个能够真正满足业务需求。我当前的实现涉及创建一个新的 jar 库,它具有以下通用实现身份验证提供者 http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/authentication/AuthenticationProvider.html, and 预认证过滤器 http://static.springsource.org/spring-security/site/docs/3.0.x/reference/preauth.html基于Spring安全。
在这种方法中,我有多个 AuthenticationProvider(当前是 Active Directory 和数据库)供应用程序进行身份验证。身份验证成功后,将在会话表中插入一行,其中包含用户、到期时间和令牌。该令牌还将作为 cookie 存储在用户的计算机上,并用于验证他们在预身份验证过滤器中拥有当前会话。
以前从未这样做过,我想确保我不会造成巨大的安全问题,而且我还想知道创建令牌需要什么?此时一个简单的 GUID 似乎就足够了?
目前我们正在开发 Spring Security 3.0.x,尚未升级到 3.1。
提前致谢。
我最终通过执行以下操作解决了这个问题:
我创建了一个认证成功处理程序 http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/AuthenticationSuccessHandler.html这会向用户的会话添加一个 cookie,其中包含标识信息和主机名,以尽可能地保护它的安全。 (该应用程序在大多数客户站点内部运行,因此这里的风险被确定为最小,但要小心 cookie 劫持。)
然后,在每个需要 SSO 的应用程序上,我实现了摘要预验证处理过滤器 http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/preauth/AbstractPreAuthenticatedProcessingFilter.html,并放置在身份验证过滤器之前,该过滤器将拉出 cookie 并创建一个身份验证对象。最后我创建了一个认证提供者 http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/preauth/PreAuthenticatedAuthenticationProvider.html它验证了 cookie 中的信息。
希望这对将来的其他人提出此类请求有所帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)