pze*_*zko 5 spring oauth-2.0 microservices spring-cloud
我有简单的微服务架构:
当用户尝试登录时,凭据正在从边缘服务传递到身份验证服务。身份验证服务从用户服务(使用@FeignClient)获取用户数据,如果用户名/密码匹配,则生成令牌。没什么好看的。
这种方法有一个“小”问题:/api/user/{username}用户服务中的端点,由身份验证服务用来获取用户的数据,可能被任何用户用来获取任何其他用户的数据(密码、角色等)。一种解决方案是以某种方式为具有角色的身份验证服务创建 JWT 令牌,AUTH_SERVICE并在用户服务端检查 JWT,如果角色与AUTH_SERVICE拒绝请求不同。
还有其他解决方案吗?
编辑
我认为我的设计很常见,但显然我应该首先更具体:
编辑2:
我最终将 auth-service 合并到了 user-service,这是几个 SO 用户的建议。在考虑之后,似乎没有必要为 JWT 生成单独的身份验证服务。我已经接受了@Abhijit Sarkar 的回答,因为它有一些有效的观点,尽管他对额外调用 auth-service 以验证令牌的有效性并不正确。
在我看来,你们的服务划分得太细了;这种情况发生了,随着时间的推移,您开始意识到,由于维护和性能问题,服务需要更加粗粒度。从身份验证到用户服务的另一个 HTTP 调用的成本以及维护服务间身份验证的开销并不是微不足道的。
IMO,用户服务可以存在其他用户信息,例如地址等(如果存在),但身份验证服务应该负责管理自己的数据。这正是 Spring Security 有UserDetailsService的原因。
用户凭证和其他用户信息是否应该位于同一个表中,甚至是同一个数据库中,这实际上是一个设计选择。不同的人会给你不同的答案,但根据我的观点和经验,少数相关人员之间共享数据库之间的共享数据库是可以接受的,特别是因为这些表将通过外键(userId)关联。分布式事务对于微服务来说是纯粹的邪恶,所以我什至不会去那里。当您删除/更新用户时,请使用事件来实现最终一致性。
编辑:
与OP聊天后,我了解到用户服务实际上是他设计中的OAuth资源服务器。他不清楚 OAuth 授权服务器在哪里,我也不清楚。无论如何,我坚持我的建议,合并用户服务和身份验证服务。
| 归档时间: |
|
| 查看次数: |
1282 次 |
| 最近记录: |