在不同 Tomcat 中具有 2 个 Spring 应用程序的 SSO

Posted

技术标签:

【中文标题】在不同 Tomcat 中具有 2 个 Spring 应用程序的 SSO【英文标题】:SSO with 2 spring applications in different Tomcats 【发布时间】:2014-10-06 12:58:28 【问题描述】:

我被要求将我们的 webapp 集成到第 3 方 webapp 中

两者都有相同的 Spring 安全配置 入口点始终是第 3 方 webapp 除非有更好的 SSO 方法,否则将通过 IFrame 进行集成

因此,如果您在同一个 Tomcat 实例中拥有两个 web 应用程序,据我所知,您可以启用 SSO 小部件,并且您可以跨 web 应用程序获得 SSO,但出于多种原因,我们在它们自己的 Tomcat 服务器中运行 web 应用程序。

我之前使用 Jasig CAS 来管理 SSO 服务,但由于主 web 应用程序不是由我们设计或维护,并且只有一个入口点,我正在寻找一种侵入性较小的方式来管理跨服务的身份验证.

我应该看别的东西吗?

【问题讨论】:

Spring 安全性在 web 应用程序中几乎没有侵入性,主要是在使用 xml 配置(只有一个 xml 文件)时。即使在 3rd 方 webapp 上也不能将身份验证移至 CAS 吗? 从技术上讲,我可能会使用 CAS,但如果可能的话,我宁愿不添加额外的层,因为这会增加负载的复杂性,我宁愿只添加一个共享登录,因为用户/角色/密码是一模一样然后出去。 【参考方案1】:

经过思考,我可以看到 3 种主要可能性:

在两个应用程序上将身份验证移至 CAS。优点:强大且经过验证的解决方案,CasAuthenticationProvider 可以使用现有的AuthenticationUserDetailsService 加载角色,将允许在基于此 cas 服务器的任何应用程序上进行首次身份验证(即使不是当前要求) - 缺点:可能是一个繁重的配置只有 2 个应用程序 使用第一个应用程序的会话 cookie 作为参考。如果您可以设法在第二个应用程序上获取它,您可以使用自定义的预认证过滤器来获取 cookie 并从第一个应用程序询问 userId。优点:如果有一个页面可以在第一个应用程序中获取 userId(用户名或...),则无需更改任何内容 - 缺点:您可能必须在要制作的 2 个应用程序之前放置一个通用反向代理它们似乎来自同一台服务器,以便能够在第二个应用程序中获取 cookie,看起来像是中间人攻击,可能需要第二个应用程序的自定义会话 cookie 在第一个应用程序上添加一个自定义过滤器,该过滤器设置一个包含令牌的自定义 cookie,并且可由第二个应用程序检索。过滤器还应该拦截一个 url 并在提交令牌时发回 userId。然后在第二个应用程序上添加一个自定义的预身份验证过滤器,该过滤器只获取此令牌并要求 userId 进行第一次过滤。优点:在第一个应用程序中添加了一个简单的过滤器,与应用程序的其余部分几乎没有交互,看起来相当简单和强大 - 缺点:需要在两个应用程序上自定义过滤器,并且因为进行了广泛的测试

我建议您考虑第一种或第三种解决方案,即使它们需要对第 3 方应用程序的 spring 安全性进行轻微修改,因为第二种方法听起来确实很肮脏

【讨论】:

以上是关于在不同 Tomcat 中具有 2 个 Spring 应用程序的 SSO的主要内容,如果未能解决你的问题,请参考以下文章

具有不同嵌入式服务器的 Spring Boot WAR 大小

Spring gzip 与 Tomcat gzip

如何使用 spring boot 插件 2.0.x 从一个具有不同依赖项的 gradle 项目生成 2 个 jars

如何使用spring boot plugin 2.0.x从一个具有不同依赖项的gradle项目生成2个jar

在 tomcat 容器中具有多个 Web 应用程序的 Spring Boot 执行器引发 javax.management.InstanceAlreadyExistsException 异常

具有多个提供程序的 Spring 安全性