当前位置: 首页 > 知识库问答 >
问题:

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

潘飞英
2023-03-14

我有两个Spring Boot Web应用程序。两个应用程序都有不同的数据库和不同的用户集。此外,两个应用程序都使用Spring Security进行身份验证和授权,这可以正常工作。

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

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

如何确保RESTAPI可以通过适当的身份验证安全访问,并且只能通过第二个应用程序的实例访问。

共有3个答案

袁凌
2023-03-14

我们使用的解决方案是使用OAuth2 client\u凭据工作流来保护这两者。这就是OAuth2流,在该流中,客户端代表自己而不是调用用户请求令牌。

查看Spring Cloud Security

1) 使用EnableResourceServer保护您的服务

@SpringBootApplication
@EnableResourceServer
public class Application ...

2)使用OAuth2RestTemboard从一个服务调用另一个服务

签出中的资源服务器令牌中继http://cloud.spring.io/spring-cloud-security/spring-cloud-security.html它将指定如何配置Oauth2RestTemplate,以将安全上下文详细信息(令牌)从一个服务转发到另一个服务。

3)服务A和服务B应该能够使用这些技术进行通信,如果它们使用相同的OAuth2 Client和Secret进行配置。这将在应用程序的application.properties文件中进行配置,希望由环境注入。OAuth2 Scopes可以用作角色标识符。因此,您可以说只有具有Scopes(api-read、api-write)的客户端才能访问服务A中的endpointA。这可以使用Spring Security的Authoration配置以及@EnableGlobalMethod odSecurity进行配置

斜瑞
2023-03-14

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

假设您通过App 1公开的REST API是通过HTTP,那么您可以将App 1配置为在客户端尝试访问此REST API(由App 1公开)时要求他们提供SSL/TLS证书。

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

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

郑伟彦
2023-03-14

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

 类似资料:
  • 问题内容: 我知道有很多类似的问题,但是没有一个是用户可以访问代码的HTML / javascript应用程序。 我有一个用nodejs编写的私有REST API。它是私有的,因为它的唯一目的是为我的HTML5客户端应用程序(Chrome应用程序和Adobe Air应用程序)提供服务器。因此,API密钥不是一个好的解决方案,因为任何用户都可以看到javascript代码。 我想避免机器人在服务器上

  • 问题内容: 我想使用PayPal出售Java应用程序。收到付款后,会向客户发送一次性下载链接到我的应用程序。 我的问题是,如何防止人们将.jar文件发送给他们的朋友/将其上传到互联网上? 显然,我需要在应用程序中进行某种检查,该检查仅允许它在一台计算机上运行。那是另一个问题,我不希望客户对一台计算机有限制,他们应该能够在家中和工作中运行它。 也许某种CD键可以解决问题?那里有Java的CD密钥资源

  • 我正在用Spring创建一个RESTful Web服务,它将运行在我的Microsoft SQL server运行的服务器上(运行Ubuntu)。 我希望我的 Web 服务访问数据库并将数据发送回客户端。我想知道的是,从我的Web服务登录到SQL服务器的正确方法是什么? 我可以对凭据进行硬编码(或将它们保存在文件中),但这似乎不太安全。SQL 服务器/JDBC 驱动程序还提供哪些其他选项?提前感谢

  • 我试图把我的头缠在这个问题上2天现在,我找不到任何正确的解决方案在网上和论坛上这个问题。 我无法使用@login\u required decorator在flask应用程序中保护dash应用程序。我可以使用blueprint route中的@login\u调用dash应用程序,以确保其安全并将其重定向到dash应用程序。 但是如果我直接调用dash-applike_localhost:5000/

  • 问题内容: 我有一个struts2 webapp,需要在其中实现CSRF保护。对于状态表格,这是非常简单的。我只需要激活拦截器,然后设置要提交的表单即可。(在这里和这里解释) 但是,当我需要为不一定通过表单提交的POST AJAX调用(我使用jQuery)启用CSRF保护时,就会出现问题。在进行后续的AJAX调用时,我面临重用令牌的问题。 任何指针或不同的方法都是可以理解的。 问题答案: 目前,我