Java 在不同的Tomcat中使用2个spring应用程序的SSO

Java 在不同的Tomcat中使用2个spring应用程序的SSO,java,spring,tomcat,spring-security,single-sign-on,Java,Spring,Tomcat,Spring Security,Single Sign On,我被要求将我们的webapp集成到第三方webapp中 两者都有相同的Spring安全配置 入口点始终是第三方webapp 除非有更好的SSO方法,否则将通过IFrame进行集成 因此,根据我所知,如果在同一个Tomcat实例中有两个Web应用程序,则可以启用SSO小部件,并且可以跨Web应用程序实现SSO,但出于多种原因,我们在各自的Tomcat服务器中运行Web应用程序 我以前使用过Jasig CAS来管理SSO服务,但由于主webapp不是由我们设计或维护的,而且只有一个入口点,因此我

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

  • 两者都有相同的Spring安全配置
  • 入口点始终是第三方webapp
  • 除非有更好的SSO方法,否则将通过IFrame进行集成
因此,根据我所知,如果在同一个Tomcat实例中有两个Web应用程序,则可以启用SSO小部件,并且可以跨Web应用程序实现SSO,但出于多种原因,我们在各自的Tomcat服务器中运行Web应用程序

我以前使用过Jasig CAS来管理SSO服务,但由于主webapp不是由我们设计或维护的,而且只有一个入口点,因此我正在寻找一种侵入性较小的跨服务管理身份验证的方法


一块饼干就足够了吗?我应该看看别的东西吗?

思考之后,我可以看到三种主要的可能性:

  • 将身份验证移动到两个应用程序上的CAS。优点:强大且经过验证的解决方案,
    CasAuthenticationProvider
    可以使用现有的
    AuthenticationUserDetailsService
    来加载角色,将允许基于此cas服务器对任何应用程序进行首次身份验证(即使不是当前的要求)-缺点:可能只有2个应用程序的配置比较繁重
  • 使用第一个应用程序的会话cookie作为参考。如果您能够在第二个应用程序上获取cookie,那么您可以使用一个定制的预验证过滤器,该过滤器获取cookie并从第一个应用程序请求userId。优点:只要有一个页面,你可以在第一个应用程序中获得用户ID(用户名或…),你就没有什么可以改变的了:你可能不得不在2个应用程序之前放置一个共同的反向代理,使它们看起来来自同一个服务器,以便能够在第二个应用程序中获得cookie,看起来像是中间人攻击,可能需要第二个应用程序的自定义会话cookie
  • 在第一个应用程序上添加自定义筛选器,该筛选器设置包含令牌的自定义cookie,并可由第二个应用程序检索。过滤器还应该截取url,并在提交令牌时发回用户ID。然后在第二个应用程序上添加一个定制的预认证过滤器,该过滤器只获取这个令牌,并向第一个过滤器请求userId。优点:在第一个应用程序中添加了一个简单的过滤器,与应用程序的其余部分几乎没有交互,看起来相当简单和健壮-缺点:在两个应用程序上都需要自定义过滤器,并且因为需要大量的测试

我建议您考虑第一或第三个解决方案,即使它们需要对第三方应用程序的Spring安全性稍作修改,因为这第二个声音确实是一个脏黑客。/P> Spring Security在WebApp中几乎没有侵入性,主要是如果使用XML配置(只有一个XML文件)。即使在第三方webapp上,也可以选择将身份验证移动到CAS吗?从技术上讲,我可能会使用CAS,但如果可能的话,我宁愿不添加额外的层,因为这会增加负载的复杂性,我宁愿只添加共享登录,因为用户/角色/密码是相同的,可以退出。