SAML 2.0 扩展迁移
本文档提供了将 SAML 2.0 服务提供者(Service Providers)从 Spring Security SAML Extensions 1.x 迁移到 Spring Security 的指导。由于 Spring Security 本身不提供身份提供者(Identity Provider)支持,因此迁移 Spring Security SAML Extensions 的身份提供者不在本文档的范围之内。
由于这两种方法彼此之间差异显著,本文档将更侧重于介绍模式,而非精确的搜索与替换步骤。
登录与注销
方法变更
Spring Security 在几个显著方面采用了与Spring Security SAML Extensions略有不同的方法。
简化启用
Spring Security SAML 扩展对服务提供方(Service Providers)的支持是通过一系列过滤器实现的,这些过滤器需要手动按正确顺序添加到各个 Spring Security 过滤器链中。
Spring Security 的 SAML 2.0 服务提供商支持通过 Spring Security DSL 方法启用:
saml2Login、
saml2Logout 和
saml2Metadata。它会选择正确的过滤器进行添加,并将它们放置在过滤器链中的适当位置。
更强的封装性
与 Spring Security SAML 扩展一样,Spring Security 的 SAML 支持也是基于 OpenSAML 构建的。该扩展项目通过公开接口暴露了 OpenSAML,模糊了这两个项目之间的界限,实际上强制依赖了 OpenSAML,从而使升级到更高版本的 OpenSAML 变得更加复杂。
Spring Security 提供了更强的封装性。没有任何公共接口暴露 OpenSAML 组件,任何在其公共 API 中暴露 OpenSAML 的类都以 OpenSaml 作为前缀命名,以提供额外的清晰度。
开箱即用的多租户支持
Spring Security SAML 扩展提供了一些轻量级的支持,允许声明多个身份提供商(Identity Provider),并在登录时通过 idp 请求参数进行访问。然而,这种方式在运行时动态修改配置方面存在局限性,同时也无法支持信赖方(relying party)与断言方(asserting party)之间的多对多关系。
Spring Security 在其默认 URL 和基本组件中内置了 SAML 2.0 多租户支持,其形式为 RelyingPartyRegistration。该组件充当依赖方(Relying Party)元数据与断言方(Asserting Party)元数据之间的链接,所有配对均可在 RelyingPartyRegistrationRepository 中进行查找。每个 URL 都代表一个唯一的注册配对,用于检索。
无论是 AuthnRequests、Responses、LogoutRequests、LogoutResponses 还是 EntityDescriptors,每个过滤器都基于 RelyingPartyRegistrationRepository,因此本质上是多租户的。
示例矩阵
Spring Security 和 Spring Security SAML 扩展都提供了如何配置服务提供方(Service Provider)的示例:
| 用例 | Spring Security | Spring Security SAML 扩展 |
|---|---|---|
登录与注销 |
||
使用 SAML 扩展 URL 登录 |
- |
|
元数据支持 |
- |
您还可以在Spring Security SAML 扩展的 GitHub 项目中查看一个展示示例。
|
Spring Security 不支持 SAML 2.0 响应的 HTTP-Redirect 绑定。 根据 SAML 规范,由于 URL 长度和签名限制,SAML 响应不允许使用 HTTP-Redirect 绑定。尝试使用此绑定可能会导致意外错误。 在配置您的身份提供者时,请改用 HTTP-POST 绑定。 |