【问题标题】:Spring Boot and SAML 2.0Spring Boot 和 SAML 2.0
【发布时间】:2014-06-02 17:27:30
【问题描述】:

有没有办法将 SAML 2.0 集成到基于 Spring Boot 的应用程序中? 我想实现自己的 SP 并与远程 IdP 通信。

【问题讨论】:

    标签: spring saml-2.0 spring-boot


    【解决方案1】:

    我实现了一个示例项目,以展示如何将 Spring Security SAML ExtensionSpring Boot 集成。

    源码发布在GitHub上:

    【讨论】:

    • 我可以用它来保护 RestAPI 吗?我也可以用这种方法假设安全令牌吗?
    • @AshikaUmangaUmagiliya 并非如此,因为此解决方案基于 WAYF 服务。要在 API 中启用 SAML 身份验证,您应该启用 ECP 协议,但它主要支持 SOAP Web 服务。
    • @vdenotaris 你能检查一下问题stackoverflow.com/questions/48883432/…
    • 您能否提供一个更新,我们需要在 bean 中预先配置 Idp,或者它可以在运行时根据用户的输入更改 Idps
    • 以防万一其他人在 2020 年引用此答案,显然 Spring 安全团队早在 2019 年 10 月就通过主要的 v2 版本彻底检修了 SAML 核心库。此代码库仍然引用 v1 实现。我找到了一个很好的例子来说明如何使用新的实现 codetinkering.com/saml2-spring-security-5-2-tutorial 。希望此信息可以避免其他人的一些困惑。
    【解决方案2】:

    我最近为这个here 发布了一个spring boot 插件。它基本上是 Spring Security SAML 的包装器,允许通过 DSL 或配置属性进行更友好的配置。这是使用 DSL 的示例:

    @SpringBootApplication
    @EnableSAMLSSO
    public class SpringBootSecuritySAMLDemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBootSecuritySAMLDemoApplication.class, args);
        }
    
        @Configuration
        public static class MvcConfig extends WebMvcConfigurerAdapter {
    
            @Override
            public void addViewControllers(ViewControllerRegistry registry) {
                registry.addViewController("/").setViewName("index");
            }
        }
    
        @Configuration
        public static class MyServiceProviderConfig extends ServiceProviderConfigurerAdapter {
            @Override
            public void configure(ServiceProviderSecurityBuilder serviceProvider) throws Exception {
                serviceProvider
                    .metadataGenerator()
                    .entityId("localhost-demo")
                .and()
                    .sso()
                    .defaultSuccessURL("/home")
                    .idpSelectionPageURL("/idpselection")
                .and()
                    .logout()
                    .defaultTargetURL("/")
                .and()
                    .metadataManager()
                    .metadataLocations("classpath:/idp-ssocircle.xml")
                    .refreshCheckInterval(0)
                .and()
                    .extendedMetadata()
                    .idpDiscoveryEnabled(true)
                .and()
                    .keyManager()
                    .privateKeyDERLocation("classpath:/localhost.key.der")
                    .publicKeyPEMLocation("classpath:/localhost.cert");
    
            }
        }
    }
    

    这基本上就是您需要的所有代码。

    【讨论】:

    • 这可以用于基于 Spring Boot 的 Rest API 吗?
    • 我认为这个答案应该被接受为最佳答案,因为它显示了与 Spring Boot Autoconfiguration 的更高级集成,而且它基于 @vdenotaris 的工作。顺便说一句,Spring Security 的 SAML 扩展还没有与 Spring Boot 正式集成,这真是太神奇了。
    • 如果您在与 spring boot rest 服务相同的应用程序中还支持 angularjs 前端,此配置是否有效?
    【解决方案3】:

    您必须在 XML 中完成所有 SAML 工作(惊喜,惊喜)。但其余的不应该妨碍,只是标准的 Springy、Booty 的东西,例如

    @EnableAutoConfiguration
    @Configuration
    @ImportResource("my-crazy-ass-saml.xml")
    public class Application implements WebMvcSecurityAdapter {
    
        // set up security filter chain here
    
    }
    

    【讨论】:

      【解决方案4】:

      我尝试了@vdenotaris 的解决方案,但似乎不适用于当前的 spring-boot,因此放弃了这种方法。

      因此,作为替代解决方案,我使用 shibboleth 使用 apache httpd 中的 mod_shib2 模块执行所有 SAML 工作,并在所述 apache 实例后面使用 mod_jk (也可以使用 mod_proxy_ajp)运行 tomcat。 Tomcat 接收所有需要的 SAML 属性作为请求属性,我只需将 idp 和用户 id 存储在常规用户表中即可将内部身份验证连接到外部(我需要 SAML 和基于密码的身份验证)。

      【讨论】:

      • 与新版Spring Boot的兼容性在我的待办事项清单上,但目前你应该按原样使用项目。
      • 不幸的是,这不是一个真正的选择,因为我们已经在当前版本的 spring-boot 之上构建了一个大型项目;因此我上面概述的解决方案。其他解决方案是在另一个 servlet 中使用 spring-saml 并使用一些临时的 inter-servlet 协议进行身份验证。那会更不美好。 :(
      【解决方案5】:

      我建议查看Spring SAML extension

      【讨论】:

      • 我目前正在尝试将此模块与 Spring Boot 集成,但这并不简单。
      • 好吧,SAML 不是一个非常简单的协议,但我认为 SAML Spring 是您最好的选择。您还可以使用 Shiboleth 等第三方软件进行 SAML 通信,并通过更简单的 API 将您的应用程序与 Shiboleth 集成
      • 在 Spring Boot 中集成 Spring SAML 我提出了无限循环的请求。我正在使用 @ImportResource 注释加载设置。
      猜你喜欢
      • 2022-08-10
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2021-08-28
      • 2020-09-30
      • 2015-02-05
      • 2020-10-26
      • 1970-01-01
      相关资源
      最近更新 更多