首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在没有中央授权模块的情况下,为每个用户添加zuul利率限制

在没有中央授权模块的情况下,为每个用户添加zuul利率限制
EN

Stack Overflow用户
提问于 2020-03-23 12:02:42
回答 1查看 813关注 0票数 0

我有一个微服务架构,它与Spring Zuul Gateway类似于下面的映像。

我的身份验证服务返回由spring身份验证解析器生成的x-auth-token,而我的令牌存储库是redis。因此,用户应该使用此服务进行身份验证,然后使用其他服务。

我的所有其他服务都连接到同一个redis实例,所以当它们接收到x-auth-token时,它们可以获得用户会话的详细信息。我通常通过使用@PreAuthorize注释来进行授权,然后指定可以访问控制器或方法的角色。

到目前为止一切都很顺利。然后,我被要求在这个架构中添加速率限制功能。因此,例如,一个用户不应该能够对图书服务中的特定api提出超过一个POST请求。另外,如果有两个图书服务实例,那么当它限制利率时,我希望两者都被计算为单一服务。

我发现了大量的文档,这些文档把我推荐到了名为spring-cloud-zuul-ratelimit.的项目看一下文档,我意识到它确实支持将redis作为存储(这对我很好,因为我已经有了redis ),它还支持每个用户的处理速率限制。

问题是我的zuul网关对用户一无所知!它无法进入红色存储器。如果我允许它访问redis,这个问题可能会解决,但另一个问题会出现:我需要授权用户两次,这需要更多的时间和更多的红宝石流量!一次在网关,一次在每个服务(检查角色和会话细节)。

我正在寻找最接近这一系列需求的解决方案:

  1. 不会更改我的身份验证方法(我不能只切换到JWT或OAuth)
  2. 不重复授权或redis查询。
  3. 在我的服务之间平衡请求不应影响费率限制。如果服务X的每个实例只为单个用户请求一次,那么用户已经发送了两个请求。
  4. 希望有一个良好的春天支持的答案。
  5. 我更希望能够动态地改变限制。
EN

回答 1

Stack Overflow用户

发布于 2020-07-09 10:17:16

Zuul网关速率限制器插件主要根据特定密钥(可以是用户的IP、某些ID、请求路径或使用自定义密钥生成器的自定义组合)在时间间隔内跟踪用户请求的计数器。您可以将其添加到现有的zuul网关应用程序中。

假设清除率器-网关使用"[clientIP][userID][method][path]"作为存储在redis中的请求计数器密钥,例如"10.8.14.58:some@mail.com:POST:/books"

以下是我能想到的一些选择:

  1. 如果客户端发送一些ID,您可以直接使用它作为速率限制器组合键。
  2. 如果用户只发送JWT令牌,则可以验证它是否声称获得用户ID,假设它嵌入在令牌中,使用与Zuul网关应用属性相同的密钥在authn服务中生成JWT令牌(使用OS env凭据、保险库等)。或者您可以只使用令牌作为用户ID。
  3. 将授权逻辑移到Spring zuul+ratelimiter服务。它将验证对author & books服务的传入请求,从令牌获取用户ID。然后使用SpringBoot过滤器将其作为另一个标头( ex:"x-app-user-id“)传递给上游服务。这样,上游服务就不会执行任何authn逻辑,它只是从头读取用户id。authorbooks服务之间的通信可能使用相同的标头。当然,这是假定上游服务器不会直接从外部网络访问。

使用不同的redis实例作为棘轮键存储也可能是个好主意。

至于动态配置,根据它的文档,您可以通过属性来调整速率限制配置。我不知道它是否可以在运行时通过Spring或其他远程配置实现进行动态调整,而不需要重新启动网关应用程序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60813216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档