![](/img/trans.png)
[英]How to allow some User only access his own data in endpoint in Spring Boot / Spring Security with pagination?
[英]Spring Cloud - how to allow access to endpoint for specific microservice only?
我有简单的微服务架构:
当用户尝试登录时,凭据将从边缘服务传递到身份验证服务。 Auth服务从用户服务(使用@FeignClient )获取用户数据,如果用户名/密码匹配,则生成令牌。 没什么好看的。
这种方法存在“小问题”:用户服务中的端点/api/user/{username}
,由auth服务用于获取用户的数据,任何用户都可以使用它来获取任何其他用户的数据(密码,角色等)。 一个解决方案是以某种方式为角色AUTH_SERVICE
auth-service创建JWT令牌,并在用户服务端检查JWT,如果角色不同, AUTH_SERVICE
拒绝AUTH_SERVICE
请求。
还有其他解决方案吗?
编辑
我认为我的设计很常见,但显然我应该首先更具体:
EDIT2:
我最终将auth-service与用户服务合并,这是来自几个SO用户的建议。 在考虑之后,似乎没有必要为JWT生成单独的auth服务。 我接受了@Abhijit Sarkar的答案,因为它有一些有效点,即使他对额外调用auth-service以验证令牌的有效性是不对的。
在我看来,你的服务太薄了; 这种情况发生了,随着时间的推移,您开始意识到由于维护和性能问题,服务需要更粗糙。 从auth到用户服务的另一个HTTP调用的成本,以及维护服务间身份验证的开销并不是微不足道的。
IMO,用户服务可以存在其他用户信息,如地址等,如果存在,但auth服务应负责管理自己的数据。 这正是Spring Security拥有UserDetailsService的原因 。
无论用户凭据和其他用户信息是在同一个表中,还是在同一个数据库中,这都是一种设计选择。 不同的人会给你不同的答案,但根据我的意见和经验,可以接受少量 相关服务之间的共享数据库,特别是因为这些表将通过外键(userId)相关联。 分布式事务是纯粹的邪恶与微服务,所以我甚至没有去那里。 删除/更新用户时,请使用事件进行最终一致性。
编辑 :
在与OP聊天之后,我了解到用户服务实际上是他设计中的OAuth资源服务器。 他不清楚,因此对我来说,OAuth授权服务器在哪里。 无论如何,我坚持我的建议是合并用户服务和auth服务。
在auth和用户服务中使用相同的数据库会更好。 Auth服务只需要访问凭证。
您甚至可以在用户服务上拥有一个安全层,以根据角色实现对URI的访问控制。
你需要这样的东西:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.