如果您的 REST API 仅由与它们一起部署的 Web 应用程序调用(在单个战争中,因此共享相同的 HTTP 会话),您可以使用 Spring SAML + Spring Security 来保护它们。
Spring SAML 将用于针对远程 IDP 对用户进行身份验证并填充他们的权利(授予权限);然后可以使用 Spring Security 为从 UI 调用的 API 定义安全策略。
如果您希望能够从远程客户端调用 REST API,您可能需要查看 Spring Security OAuth 项目——因为这不再是关于 Web 单点登录。
可以创建处理所有 SSO 逻辑的 Spring SAML 的中央安装。当然,您需要实现一种机制,在该机制中 Spring SAML 将有关经过身份验证的用户及其属性的信息传递给您的其他应用程序,并以安全的方式进行。一种可能的解决方法(假设应用程序部署在同一域上,因此可以共享 cookie)是:
- 在 Spring SAML 中进行身份验证后,设置一个对所有其他应用程序可见的共享 cookie,例如由 Spring SAML 的密钥签名或使用共享密钥加密,该 cookie 还应该包含用户的属性
- 这可以在自定义的 AuthenticationSuccessHandler 中完成,随后预计将用户重定向到正确的应用程序(例如,基于一些自定义逻辑或中继状态)
- 目标应用程序需要验证 cookie(通过检查签名或使用共享密钥解密,可能执行其他检查),解析属性并启动自己的会话,该会话基于 cookie 的内容进行预认证
所有这些都可以通过实现 Spring Security 和 Spring SAML 的标准接口来完成。但这不是一项微不足道的任务 - 主要考虑到您的实现中的任何安全漏洞都可能危及您的应用程序的安全性。