如何保护 Spring Boot Web 应用程序中的 REST API?
Posted
技术标签:
【中文标题】如何保护 Spring Boot Web 应用程序中的 REST API?【英文标题】:How to secure REST APIs in Spring Boot web application? 【发布时间】:2017-08-09 18:38:22 【问题描述】:我有两个 Spring Boot Web 应用程序。两个应用程序都有不同的数据库和不同的用户集。此外,这两个应用程序都使用 Spring Security 进行身份验证和授权,可以正常工作。
在任何时候,我都会运行第一个应用程序的一个实例和运行第二个 Web 应用程序的多个实例。
我想从第一个 Web 应用程序(运行一个实例)公开 REST API,并能够从第二个 Web 应用程序(运行多个实例)使用该 REST API。
如何确保 REST API 可以通过适当的身份验证以及仅由第二个应用程序的实例安全访问。
【问题讨论】:
向我们展示两个应用程序的 Spring Security 配置。 你能澄清你想要达到的目标吗? “我想从第一个 Web 应用程序(运行一个实例)公开 REST API,并能够从第二个 Web 应用程序(运行多个实例)使用该 REST API。”没有意义。 所以,基本上我会将第一个 Web 应用程序部署在单个服务器(即 tomcat)上。它将有一些 REST API。我将第二个 Web 应用程序也部署在另一个 Web 服务器上。现在,第二个 Web 应用程序基本上是一个客户端应用程序。因此,如果有很多客户端,每个客户端都会为在单独的 tomcat 中运行的第二个应用程序进行自己的战争。因此,第二个应用程序的多个实例。现在,我希望能够从具有适当安全性和授权的所有第二个客户端应用程序的第一个 Web 应用程序访问 REST Api。 【参考方案1】:如果您认真考虑安全方面,则可以选择基于 SSL 的身份验证。
假设您由 App 1 公开的 REST api 通过 HTTPs,那么您可以配置 App 1 以在客户端尝试访问此 REST API(由 App 1 公开)时要求客户端提供其 SSL/TLS 证书。
这将帮助我们确定客户端确实是来自应用 2 的客户端。
再多两美分: 如果你的 App 1 REST API 调用需要负载平衡,nginx 应该是你的选择。基于 SSL 客户端证书的身份验证可以卸载到 NGINX,您的 Spring Boot 应用程序不再担心 SSL 相关配置。
【讨论】:
【参考方案2】:如果您可以更改安全性,我建议您使用 OAUTH2。基本上,它会生成一个令牌,用于在您的 APP2 实例中进行 API 调用。 你可以在这里看到更多。
https://spring.io/guides/tutorials/spring-boot-oauth2/
http://websystique.com/spring-security/secure-spring-rest-api-using-oauth2/
但如果您无法更改 APP 的安全性,您可以继续使用当前架构。在APP1中你可以为API调用创建一个用户,这个用户只能访问API服务。在您的 APP2 中,您需要存储访问 APP1 的凭据。最后你登录APP1并使用HTTP客户端调用API,你可以使用Spring RestTemplate或Apache HttpComponents Client。
【讨论】:
【参考方案3】:我们采用的解决方案是使用 OAuth2 client_credentials 工作流程来保护两者。这是 OAuth2 流程,客户端代表他们自己而不是调用用户请求令牌。
查看Spring Cloud Security
1) 使用 @EnableResourceServer
保护您的服务
@SpringBootApplication
@EnableResourceServer
public class Application ...
2) 使用OAuth2RestTemplate
从一个服务调用另一个服务
查看http://cloud.spring.io/spring-cloud-security/spring-cloud-security.html 中的资源服务器令牌中继,它将指定如何配置Oauth2RestTemplate
以将安全上下文详细信息(令牌)从一个服务转发到另一个服务。
3) 如果服务 A 和服务 B 使用相同的 Oauth2 客户端和密钥进行配置,则它们应该能够使用这些技术进行通信。这将在应用程序的 application.properties 文件中配置,希望由环境注入。 Oauth2 范围可以用作角色标识符。因此,您可以说只有具有 Scopes(api-read、api-write)的 Client 才能访问 中的 Endpoint A服务 A。这可以使用 Spring Security 的授权配置以及 @EnableGlobalMethodSecurity
【讨论】:
以上是关于如何保护 Spring Boot Web 应用程序中的 REST API?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OAuth2 和社交登录保护 Spring Boot RESTful 服务
如何在不维护 jsessionid 的情况下在 Spring Boot 中保护 RESTful API
使用 OpenID Connect Gluu 身份验证提供程序来保护 Spring Boot Web App 客户端