微服务安全性、Spring boot

问题描述 投票:0回答:1

希望你一切都好。我正在使用 Spring Boot 学习微服务,目前,我正在使用 JWT 令牌研究微服务的安全性。

我有一个授权服务(处理用户创建、登录、注册等)、一个主服务(包含一些业务逻辑)和一个 API 网关。据我了解,我们应该使用API网关来检查令牌是否存在以及是否有效。

但是,我有一些问题:

如何在主服务中获取经过身份验证的用户?在整体应用程序中,我会将其保存在“每个请求一个”过滤器的 SecurityContextHolder 中。 如果主服务中有一个端点不仅需要通过有效的 JWT(我当前在 API 网关中检查)来保护,还需要通过经过身份验证的用户所具有的角色来保护,该怎么办? 实现这一点的最佳实践是什么?我是否应该向主服务(以及将来的所有其他服务)添加一个“每个请求一个”过滤器来调用授权服务、检查 JWT 并从中获取用户信息?对于每个请求都调用授权服务是一个好主意吗?

此外,对于基于角色的安全性,我还应该为每个服务配置安全端点吗?

java spring-boot security microservices
1个回答
0
投票

这实际上是 JWT 的漏洞:您可以生成一个令牌,其中保存有关用户的信息以及有关其角色和授权的信息,该令牌是从授权服务签名的,但其他服务不需要调用授权服务或数据库要了解用户信息或该用户的角色,他们只需要一个共享秘密来检查令牌的有效性,并且他们知道令牌内的所有信息都是有效的 所以你要做的是:

代币生成:

  • 当用户登录时,授权服务会生成 JWT。
  • JWT 保存用户信息(如用户名、角色、权限)。
  • 令牌由授权服务使用密钥进行签名。 签名确保令牌不能被篡改。

无需连续调用授权服务:

  • 一旦发行代币,其他服务无需查询 授权服务或数据库来验证用户的身份 或角色。
  • 这是因为有关用户的信息位于 JWT 内部,并且 它由授权服务签名。
  • 只要签名有效,服务就可以信任令牌, 他们共享一个密钥来验证签名。

令牌验证:

  • 当用户向服务发出请求时,他们会发送 JWT。
  • 服务使用共享密钥检查令牌的签名。
  • 如果签名有效,服务将从令牌中提取用户的信息(包括角色和授权)。
  • 这就是为什么它不需要再次联系授权服务——它可以信任 JWT 内的信息。

授权:

  • 服务验证 JWT 后,它可以根据令牌中编码的角色检查用户是否具有必要的权限。
  • 服务可以根据角色允许或拒绝对所请求资源的访问。

结论

  • JWT 包含您需要的所有信息,它不像会话 ID,它就像一个 JSON 对象,包含有关经过身份验证的所有信息 用户
  • JWT 通过签名进行验证
© www.soinside.com 2019 - 2024. All rights reserved.