繁体   English   中英

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

[英]Spring Cloud - how to allow access to endpoint for specific microservice only?

我有简单的微服务架构:

  • 优质服务
  • 服务注册
  • auth服务(我正在使用JWT和OAuth2)
  • 用户服务
  • 前端和一些核心服务

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

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

还有其他解决方案吗?

编辑

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

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

EDIT2:

我最终将auth-service与用户服务合并,这是来自几个SO用户的建议。 在考虑之后,似乎没有必要为JWT生成单独的auth服务。 我接受了@Abhijit Sarkar的答案,因为它有一些有效点,即使他对额外调用auth-service以验证令牌的有效性是不对的。

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

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

无论用户凭据和其他用户信息是在同一个表中,还是在同一个数据库中,这都是一种设计选择。 不同的人会给你不同的答案,但根据我的意见和经验,可以接受少量 相关服务之间的共享数据库,特别是因为这些表将通过外键(userId)相关联。 分布式事务是纯粹的邪恶与微服务,所以我甚至没有去那里。 删除/更新用户时,请使用事件进行最终一致性。

编辑

在与OP聊天之后,我了解到用户服务实际上是他设计中的OAuth资源服务器。 他不清楚,因此对我来说,OAuth授权服务器在哪里。 无论如何,我坚持我的建议是合并用户服务和auth服务。

在auth和用户服务中使用相同的数据库会更好。 Auth服务只需要访问凭证。

您甚至可以在用户服务上拥有一个安全层,以根据角色实现对URI的访问控制。

你需要这样的东西:

  1. 在边缘服务中定义预滤波器
  2. 边缘服务获取身份验证请求并将其转发到身份验证服务。
  3. Auth服务使用与用户服务相同的DB来验证用户身份并生成JWT令牌。
  4. 所有其他请求将在请求标头中具有令牌。
  5. 边缘服务共享创建JWT令牌的密钥或具有用于验证签名的公钥。
  6. 边缘服务在其预过滤器中验证令牌,并在平面中的请求标头中添加用户信息。 将请求重定向到所需服务。
  7. 服务接收请求,并在其安全过滤器中,它使用标头中的用户信息来强制对资源进行访问控制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM