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

标签 spring oauth-2.0 microservices spring-cloud

我有简单的微服务架构:

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

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

    这种方法有一个“小”问题:端点 /api/user/{username}在用户服务中,身份验证服务使用它来获取用户的数据,任何用户都可以使用它来获取任何其他用户的数据(密码、角色等)。一种解决方案是以某种方式为身份验证服务创建 JWT token ,角色为 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 以验证 token 的有效性并不正确。

    最佳答案

    在我看来,您将服务拆分得太细了;这种情况会发生,随着时间的推移,您开始意识到由于维护和性能问题,服务需要更粗粒度。从 auth 到用户服务的另一个 HTTP 调用的成本,以及维护服务间 auth 的开销并不小。

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

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

    编辑 :

    和OP聊了聊,才知道user service其实就是他设计的OAuth资源服务器。他不清楚,因此对我来说,OAuth 授权服务器在哪里。无论如何,我支持合并用户服务和身份验证服务的建议。

    关于Spring Cloud - 如何仅允许访问特定微服务的端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44988481/

    相关文章:

    spring - 如何使用@Autowired像工厂模式一样动态注入(inject)实现

    perl - Perl 中的 Microsoft OneDrive API 客户端无法获取访问 token

    javascript - IFRAME 沙盒中的 Google OAuth2 和应用脚本

    architecture - 微服务架构中的搜索查询

    web-services - 什么是 SOA、微服务、REST 和 Web 服务 "in plain English"?

    java - 如果没有本地仓库并且没有为maven设置环境变量,spring boot如何使用maven?

    java - jSTL 显示嵌套对象数据

    web-services - 跨微服务查询/分页

    java - 为什么 Spring Web 在 GET 请求上抛出 415 错误代码响应?

    java - 如何在 android 中为 google api 交换 OAuth2 token 的授权码?