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

时间:2017-03-18 04:34:36

标签: rest spring-boot spring-security

我有两个Spring Boot Web应用程序。两个应用程序都有不同的数据库和不同的用户组。此外,两个应用程序都使用Spring Security进行身份验证和授权。

在任何给定的点上,我将运行第一个应用程序的一个实例,并运行第二个Web应用程序的多个实例。

我希望从第一个Web应用程序(一个运行的实例)公开REST API,并能够使用来自第二个Web应用程序的REST API(运行多个实例)。

如何确保通过正确的身份验证和第二个应用程序的实例安全地访问REST API。

3 个答案:

答案 0 :(得分:3)

如果您可以更改安全性,我建议您使用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。

答案 1 :(得分:0)

如果您认真考虑安全方面,

基于SSL的身份验证可能是一种选择。

假设您通过App 1暴露的REST api是通过HTTP,然后您可以配置App 1,以便客户端在尝试访问此REST API(由App 1公开)时提供其SSL / TLS证书。

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

两个以上:
如果您的App 1 REST API调用需要负载平衡,NGINX应该是您的选择。基于SSL客户端证书的身份验证可以卸载到NGINX,而您的Spring启动应用程序不再需要担心SSL相关配置。

答案 2 :(得分: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以将安全上下文详细信息(令牌)从一个服务转发到另一个服务。< / p>

3)如果服务A和服务B使用相同的Oauth2客户端和密钥进行配置,则它们应该能够使用这些技术进行通信。这将在应用程序中配置&#39; application.properties文件,希望由环境注入。 Oauth2 Scopes可用作角色标识符。因此,您可以说只有客户 范围(api-read,api-write)才能访问中的端点A 服务A 。这可以使用Spring Security的授权配置以及@EnableGlobalMethodSecurity

进行配置