Spring Cloud - 如何仅允许访问特定微服务的端点?

pze*_*zko 5 spring oauth-2.0 microservices spring-cloud

我有简单的微服务架构:

  • 边缘服务
  • 服务注册
  • 身份验证服务(我正在使用 JWT 和 OAuth2)
  • 用户服务
  • 前端和一些核心服务

当用户尝试登录时,凭据正在从边缘服务传递到身份验证服务。身份验证服务从用户服务(使用@FeignClient)获取用户数据,如果用户名/密码匹配,则生成令牌。没什么好看的。

这种方法有一个“小”问题:/api/user/{username}用户服务中的端点,由身份验证服务用来获取用户的数据,可能被任何用户用来获取任何其他用户的数据(密码、角色等)。一种解决方案是以某种方式为具有角色的身份验证服务创建 JWT 令牌,AUTH_SERVICE并在用户服务端检查 JWT,如果角色与AUTH_SERVICE拒绝请求不同。

还有其他解决方案吗?

编辑

我认为我的设计很常见,但显然我应该首先更具体:

  • Auth-servie 是我的授权服务器,其他服务是资源服务器
  • 我使用 API 网关模式,我的身份验证服务也在代理
  • 客户端应用程序获取 JWT 后,将其添加到每个请求中,并在此基础上进行身份验证和授权;每个资源服务器都有一个用于验证签名的公钥;如果有效,则服务知道 JWT 已由受信任的 auth-service 生成,并且基于 JWT 的服务创建包含所有用户信息的 OAuth2Authenication 对象

编辑2:

我最终将 auth-service 合并到了 user-service,这是几个 SO 用户的建议。在考虑之后,似乎没有必要为 JWT 生成单独的身份验证服务。我已经接受了@Abhijit Sarkar 的回答,因为它有一些有效的观点,尽管他对额外调用 auth-service 以验证令牌的有效性并不正确。

Abh*_*kar 2

在我看来,你们的服务划分得太细了;这种情况发生了,随着时间的推移,您开始意识到,由于维护和性能问题,服务需要更加粗粒度。从身份验证到用户服务的另一个 HTTP 调用的成本以及维护服务间身份验证的开销并不是微不足道的。

IMO,用户服务可以存在其他用户信息,例如地址等(如果存在),但身份验证服务应该负责管理自己的数据。这正是 Spring Security 有UserDetailsS​​ervice的原因。

用户凭证和其他用户信息是否应该位于同一个表中,甚至是同一个数据库中,这实际上是一个设计选择。不同的人会给你不同的答案,但根据我的观点和经验,少数相关人员之间共享数据库之间的共享数据库是可以接受的,特别是因为这些表将通过外键(userId)关联。分布式事务对于微服务来说是纯粹的邪恶,所以我什至不会去那里。当您删除/更新用户时,请使用事件来实现最终一致性。

编辑

与OP聊天后,我了解到用户服务实际上是他设计中的OAuth资源服务器。他不清楚 OAuth 授权服务器在哪里,我也不清楚。无论如何,我坚持我的建议,合并用户服务和身份验证服务。