Spring Boot 和 SAML 2.0

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

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

源码发布在GitHub上:

spring-boot-saml-integration on GitHub

【讨论】:

我可以用它来保护 RestAPI 吗?我也可以用这种方法假设安全令牌吗? @AshikaUmangaUmagiliya 并非如此,因为此解决方案基于 WAYF 服务。要在 API 中启用 SAML 身份验证,您应该启用 ECP 协议,但它主要支持 SOAP Web 服务。 @vdenotaris 你能检查一下问题***.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 注释加载设置。

以上是关于Spring Boot 和 SAML 2.0的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中从 Azure SAML 2.0 应用程序获取角色或组

使用 Spring Security Saml 和 SP 应用程序的无状态会话

Spring SAML 2.0 - 导入 IDP 的本地元数据 - MetadataProviderException

为 SAML 2.0 联合中的一个 SP 生成自定义属性 - 身份

Shibboleth SP 是 SAML 2.0 的实现吗?

SAML 2.0 单次注销问题 - IdP 应如何终止在不同用户代理中运行的 SP 会话?