希望你一切都好。我正在使用 Spring Boot 学习微服务,目前,我正在使用 JWT 令牌研究微服务的安全性。
我有一个授权服务(处理用户创建、登录、注册等)、一个主服务(包含一些业务逻辑)和一个 API 网关。据我了解,我们应该使用API网关来检查令牌是否存在以及是否有效。
但是,我有一些问题:
如何在主服务中获取经过身份验证的用户?在整体应用程序中,我会将其保存在“每个请求一个”过滤器的 SecurityContextHolder 中。 如果主服务中有一个端点不仅需要通过有效的 JWT(我当前在 API 网关中检查)来保护,还需要通过经过身份验证的用户所具有的角色来保护,该怎么办? 实现这一点的最佳实践是什么?我是否应该向主服务(以及将来的所有其他服务)添加一个“每个请求一个”过滤器来调用授权服务、检查 JWT 并从中获取用户信息?对于每个请求都调用授权服务是一个好主意吗?
此外,对于基于角色的安全性,我还应该为每个服务配置安全端点吗?
这实际上是 JWT 的漏洞:您可以生成一个令牌,其中保存有关用户的信息以及有关其角色和授权的信息,该令牌是从授权服务签名的,但其他服务不需要调用授权服务或数据库要了解用户信息或该用户的角色,他们只需要一个共享秘密来检查令牌的有效性,并且他们知道令牌内的所有信息都是有效的 所以你要做的是:
代币生成:
无需连续调用授权服务:
令牌验证:
授权:
结论: