如何授权微服务内部通信?

时间:2019-06-20 06:19:51

标签: spring-security jwt microservices spring-security-oauth2 spring-security-rest

我有多个微服务。客户端可以通过API网关调用它,并且微服务可以彼此通信。

理想情况下,请求将来自具有所有权限的用户的API网关。 在这里,我正在尝试仅将所需角色分配给用户,例如,如果用户(浏览器)需要来自微服务A的数据,那么只会将该角色分配给用户,并且如果内部微服务A需要来自B(剩余呼叫)的数据,则该角色不应分配给用户。

要求:如何限制/授权微服务之间的内部通信,以便只有授权的微服务才能拨打电话给其他人。

选项:

  1. 将所有角色分配给用户,即使是内部通信(在所有通信中传递相同的令牌)。

  2. 如果需要内部通信,则仅将面向微服务的用户角色分配给用户,然后每个微服务将自己充当其他微服务的用户,并在调用之前生成自己的令牌。

    < / li>
  3. 不允许微服务进行内部通信,而是从所有微服务中获取所有数据并在客户端进行处理。

以上或任何其他方法最适合使用哪个选项?

2 个答案:

答案 0 :(得分:1)

我会选择选项2。对于内部服务通信,后端服务(应用程序)将充当客户端并首先请求令牌(/oauth/token)。为了验证这些令牌,所有服务都需要一种机制来验证这些令牌(/oauth/check_token)。您可以为此使用Client Credentials Grant类型。这些/oauth/**端点由Spring提供。要从一个服务向另一个服务发出REST请求,请使用OAuth2RestTemplateits 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')"/>

要获得更多限制,请为每个应用程序(而不是每个应用程序实例)颁发自签名证书。在单个信任库中添加所有应用程序的公钥。在应用程序启动期间,让所有应用程序下载此信任库。使用此应用程序将仅与它信任的那些应用程序对话。

答案 1 :(得分:0)

我们混合使用了选项1和2。

如果用户调用API,则如果第一个网关调用服务A,然后服务A调用服务B,则A将相同的JWT令牌传递给服务B。

如果服务A中的计时器作业定期从服务B获取一些数据,则服务A还具有其JWT令牌,通过它可以调用服务B。