在任何给定时刻,我将拥有第一个应用程序的一个实例正在运行,并且第二个网络应用程序的多个实例正在运行。
我希望从第一个网络应用程序(一个实例正在运行)公开REST API,并能够从第二个网络应用程序(多个实例正在运行)中使用该REST API。
如何确保REST 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。
如果您认真考虑安全方面,基于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相关的配置。
@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
进行配置。