如何授权微服务内部通信?
How to Authorize micro-services internal communication?
我有多个微服务。客户端可以通过API网关调用,微服务也可以相互通信。
理想情况下,请求将来自 API 用户的网关,该用户将拥有所有权限。
在这里,我试图只为用户分配所需的角色,例如,如果用户(浏览器)需要来自微服务 A 的数据,那么只有该角色将被授予用户,如果内部微服务 A 需要来自 B 的数据(rest call),那么该角色不应分配给用户。
需求:如何restrict/authorize微服务之间的内部通信,只有授权的微服务才能调用其他。
选项:
为用户分配所有角色,即使是内部通信(在所有通信中传递相同的令牌)。
如果需要内部通信,则仅将面向用户的微服务角色分配给用户,然后每个微服务将充当其他微服务的用户,并在调用前生成自己的令牌。
- 不允许微服务在内部通信,而是从所有微服务获取所有数据并在客户端处理。
哪个选项最适合使用上面的选项或任何其他选项?
我会选择选项 2。对于 intra-service 通信,后端服务(应用程序)将充当客户端并首先请求令牌 (/oauth/token
)。为了验证这些令牌,所有服务都需要一种机制来验证这些令牌 (/oauth/check_token
)。您可以使用 Client Credentials Grant type for this. These /oauth/**
endpoints are provided by Spring. For making REST request from one service to another, use OAuth2RestTemplate and its not thread-safe.
在每个应用程序中,您需要为各种端点定义安全保护规则。像这样:
<sec:filter-security-metadata-source id="securityMetadataSource"
request-matcher="ant"
use-expressions="true">
<sec:intercept-url pattern="/accounts/**" access="isFullyAuthenticated() and hasRole('PRIVATE_SERVICE')"/>
<sec:intercept-url pattern="/members/member-details" method="GET" access="isFullyAuthenticated() and hasRole('PORTAL_USER')"/>
要获得更多限制,您可以为每个应用程序(而不是每个应用程序实例)颁发 self-signed 证书。在单个信任库中添加所有应用程序的 public 密钥。在应用程序启动期间,让所有应用程序下载此信任库。使用此应用程序将仅与它信任的那些应用程序通信。
我们混合使用选项 1 和 2。
如果用户调用 API ,则如果首先网关调用服务 A,然后服务 A 调用服务 B,则 A 将相同的 JWT 令牌传递给服务 B。
如果服务 A 中的计时器作业定期从服务 B 获取一些数据,服务 A 也有其 JWT 令牌,通过它调用服务 B。
我有多个微服务。客户端可以通过API网关调用,微服务也可以相互通信。
理想情况下,请求将来自 API 用户的网关,该用户将拥有所有权限。 在这里,我试图只为用户分配所需的角色,例如,如果用户(浏览器)需要来自微服务 A 的数据,那么只有该角色将被授予用户,如果内部微服务 A 需要来自 B 的数据(rest call),那么该角色不应分配给用户。
需求:如何restrict/authorize微服务之间的内部通信,只有授权的微服务才能调用其他。
选项:
为用户分配所有角色,即使是内部通信(在所有通信中传递相同的令牌)。
如果需要内部通信,则仅将面向用户的微服务角色分配给用户,然后每个微服务将充当其他微服务的用户,并在调用前生成自己的令牌。
- 不允许微服务在内部通信,而是从所有微服务获取所有数据并在客户端处理。
哪个选项最适合使用上面的选项或任何其他选项?
我会选择选项 2。对于 intra-service 通信,后端服务(应用程序)将充当客户端并首先请求令牌 (/oauth/token
)。为了验证这些令牌,所有服务都需要一种机制来验证这些令牌 (/oauth/check_token
)。您可以使用 Client Credentials Grant type for this. These /oauth/**
endpoints are provided by Spring. For making REST request from one service to another, use OAuth2RestTemplate and its not thread-safe.
在每个应用程序中,您需要为各种端点定义安全保护规则。像这样:
<sec:filter-security-metadata-source id="securityMetadataSource"
request-matcher="ant"
use-expressions="true">
<sec:intercept-url pattern="/accounts/**" access="isFullyAuthenticated() and hasRole('PRIVATE_SERVICE')"/>
<sec:intercept-url pattern="/members/member-details" method="GET" access="isFullyAuthenticated() and hasRole('PORTAL_USER')"/>
要获得更多限制,您可以为每个应用程序(而不是每个应用程序实例)颁发 self-signed 证书。在单个信任库中添加所有应用程序的 public 密钥。在应用程序启动期间,让所有应用程序下载此信任库。使用此应用程序将仅与它信任的那些应用程序通信。
我们混合使用选项 1 和 2。
如果用户调用 API ,则如果首先网关调用服务 A,然后服务 A 调用服务 B,则 A 将相同的 JWT 令牌传递给服务 B。
如果服务 A 中的计时器作业定期从服务 B 获取一些数据,服务 A 也有其 JWT 令牌,通过它调用服务 B。