我有简单的微服务架构:
当用户尝试登录时,凭据正在从边缘服务传递到身份验证服务。身份验证服务从用户服务中获取用户数据(使用 @FeignClient ),如果用户名/密码匹配,则生成 token 。没什么好看的。
这种方法有一个“小”问题:端点
/api/user/{username}
在用户服务中,身份验证服务使用它来获取用户的数据,任何用户都可以使用它来获取任何其他用户的数据(密码、角色等)。一种解决方案是以某种方式为身份验证服务创建 JWT token ,角色为 AUTH_SERVICE
并在用户服务端检查 JWT,如果角色不同于 AUTH_SERVICE
拒绝请求。还有其他解决方案吗?
编辑
我认为我的设计很常见,但显然我应该首先更具体:
编辑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/