我有多个微服务。客户端可以通过API网关调用它,并且微服务可以彼此通信。
理想情况下,请求将来自具有所有权限的用户的API网关。 在这里,我正在尝试仅将所需角色分配给用户,例如,如果用户(浏览器)需要来自微服务A的数据,那么只会将该角色分配给用户,并且如果内部微服务A需要来自B(剩余呼叫)的数据,则该角色不应分配给用户。
要求:如何限制/授权微服务之间的内部通信,以便只有授权的微服务才能拨打电话给其他人。
选项:
将所有角色分配给用户,即使是内部通信(在所有通信中传递相同的令牌)。
如果需要内部通信,则仅将面向微服务的用户角色分配给用户,然后每个微服务将自己充当其他微服务的用户,并在调用之前生成自己的令牌。
< / li>以上或任何其他方法最适合使用哪个选项?
答案 0 :(得分:1)
我会选择选项2。对于内部服务通信,后端服务(应用程序)将充当客户端并首先请求令牌(/oauth/token
)。为了验证这些令牌,所有服务都需要一种机制来验证这些令牌(/oauth/check_token
)。您可以为此使用Client Credentials Grant类型。这些/oauth/**
端点由Spring提供。要从一个服务向另一个服务发出REST请求,请使用OAuth2RestTemplate和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')"/>
要获得更多限制,请为每个应用程序(而不是每个应用程序实例)颁发自签名证书。在单个信任库中添加所有应用程序的公钥。在应用程序启动期间,让所有应用程序下载此信任库。使用此应用程序将仅与它信任的那些应用程序对话。
答案 1 :(得分:0)
我们混合使用了选项1和2。
如果用户调用API,则如果第一个网关调用服务A,然后服务A调用服务B,则A将相同的JWT令牌传递给服务B。
如果服务A中的计时器作业定期从服务B获取一些数据,则服务A还具有其JWT令牌,通过它可以调用服务B。