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 Extension 与 Spring 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 Boot 2.0:Spring Boot 开源软件都有哪些?(转)
为啥 spring-saml-extension 和 adfs 2.0 返回 403 错误?