如何在Spring Boot Web应用程序中保护REST API?

5
我有两个Spring Boot网络应用程序。这两个应用程序具有不同的数据库和不同的用户集。此外,这两个应用程序都使用Spring Security进行身份验证和授权,其功能正常。
在任何给定时刻,我将拥有第一个应用程序的一个实例正在运行,并且第二个网络应用程序的多个实例正在运行。
我希望从第一个网络应用程序(一个实例正在运行)公开REST API,并能够从第二个网络应用程序(多个实例正在运行)中使用该REST API。
如何确保REST API可以安全地访问并且只能被第二个应用程序的实例正确认证?

1
请展示您两个应用程序的Spring Security配置。 - shazin
1
你能澄清一下你想要实现什么吗?“我想从第一个网络应用程序(运行一个实例)公开REST API,并能够从第二个网络应用程序(运行多个实例)使用该REST API。” 这句话没有意义。 - PaulNUK
所以,基本上我将在单个服务器(即tomcat)上部署第一个Web应用程序。它将具有一些REST API。我还将在另一个Web服务器上部署第二个Web应用程序。现在,这第二个Web应用程序基本上是客户端应用程序。因此,如果有许多客户端,则每个客户端都将在单独的tomcat中运行其自己的第二个应用程序war。因此,第二个应用程序的多个实例。现在,我希望能够从所有第二个客户端应用程序中以适当的安全性和授权访问第一个Web应用程序的REST API。 - ajm
3个回答

3
如果您能改变安全性,我建议您使用OAUTH2。基本上,它会生成一个用于在您的APP2实例中进行API调用的令牌。您可以在此处了解更多信息。

https://spring.io/guides/tutorials/spring-boot-oauth2/

http://websystique.com/spring-security/secure-spring-rest-api-using-oauth2/

但是如果您不能改变您的应用程序的安全性,您可以继续使用当前的架构。在APP1中,您可以为API调用创建一个用户,该用户仅能访问API服务。在APP2中,您需要存储访问APP1的凭据。最后,您登录到APP1并使用HTTP客户端调用API,您可以使用Spring RestTemplate或Apache HttpComponents Client。


0

如果您认真考虑安全方面,基于SSL的身份验证可能是一个选择。

假设您的App 1暴露的REST API是通过HTTPs进行的,那么您可以配置App 1在客户端尝试访问此REST API(由App 1公开)时要求客户端提供其SSL / TLS证书。

这将有助于我们确定客户端确实是来自app 2的客户端。

另外两个建议:
如果您的App 1 REST API调用需要负载均衡,则应选择NGINX。 SSL客户端证书基于身份验证可以卸载到NGINX上,您的Spring Boot应用程序不再需要担心与SSL相关的配置。


0
我们采用的解决方案是使用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) 如果使用相同的 Oauth2 客户端和密钥进行配置,则应该能够使用这些技术使服务 A 和服务 B 进行通信。这将在应用程序的 application.properties 文件中进行配置,希望通过环境注入。Oauth2 范围可以用作角色标识符。因此,您可以说只有具有 Scopes(api-read、api-write)的客户端才能访问 Service A 中的 Endpoint A。这可以使用 Spring Security 的授权配置以及 @EnableGlobalMethodSecurity 进行配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接