在Spring Boot中确保内部微服务调用安全的最佳方法是什么

And*_*ter 5 spring spring-security spring-integration spring-boot spring-security-oauth2

我正在草拟一个简单的应用程序,其中将包括三个松散耦合的服务:身份验证(在春季安全性下使用OAuth2),配置文件和首选项,数据收集。我正在尝试确定保护或构建这些服务之间的安全调用的最佳方法。考虑以下两种用户情况。在每种情况下,用户都已通过身份验证,并且请求将包含指向初始服务端点的有效JWT令牌:

情况1:用户想要编辑自己喜欢的水果的偏好。该应用程序将对Profile / Preference服务进行身份验证的调用,以获取其首选项,然后回发更新的首选项。

情况2:他们向数据收集服务发出请求,该服务将轮询杂货店API以获取水果价格。这需要从配置文件和首选项服务中查找其首选水果。

我的问题是,确保上述案例2的配置文件和首选项服务的最佳方法是什么。我觉得有三种可能的方法:

  1. 每个内部请求都将需要包括任何身份验证标头才能在当前用户上下文中传递
  2. 每个内部请求都需要以其他方式作为API用户进行身份验证
  3. 每个内部请求都将需要到达不同的终结点,该终结点没有公开公开,也没有连接到负载均衡器中以用于内部流量

Spring Boot的某个方面是否提供了开箱即用的功能?

Mic*_*urt -1

由于微服务带来了独立应用程序“智能应用程序和哑管道”的概念,因此您已经可以摆脱解决方案 3,这需要某种基于网络的安全性。

如果我可以用我自己的话翻译你的问题:

你想要做什么:客户端 -> App1 -> App2
问题:如何保护从 App1 到 App2 的调用

剩下的两个解决方案:

  1. 当App1调用App2时,App1将从Client收到的token转发给App2
  2. 当 App1 调用 App2 时,App1 以自己的名称请求一个令牌(客户端凭据授予),并将其传递给 App2

解决方案2.的问题在于它可能会带来权限问题:
如果调用App1的客户端没有调用App2的权限(范围),那么App1无论如何都会调用App2,因为App1将拥有其自己名称的权限。

结论:解决方案 1.是唯一可行的。