当前位置: 首页 > 知识库问答 >
问题:

在没有集中授权模块的情况下,添加每个用户的zuul速率限制

太叔富
2023-03-14

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

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

到目前为止一切正常。然后我被要求在这个架构中添加速率限制功能。因此,例如,单个用户不能向books服务中的特定api发出超过1个POST请求。另外,如果有两个book服务实例,我希望在其关于速率限制时将这两个实例都算作单个服务。

我找到了大量的文件,这些文件让我了解了这个名为sping-Cloud-zuul-ratlimit的项目。看着文档,我意识到它确实支持redis作为存储(对我来说很好,因为我已经有redis了),它还支持每个用户的处理速率限制。

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

我正在寻找与此需求列表最接近的解决方案:

  1. 不会更改我的身份验证方法(我不能直接切换到JWT或OAuth)

共有1个答案

东方辉
2023-03-14

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

比方说,rratimiter-网关正在使用"[clientIP][userID][method][path]"作为存储在redis中的请求计数器密钥,例如"10.8.14.58:some@mail.com: POST:/book"

这里有一些我能想到的选择:

  1. 如果客户端发送一些ID,您可以直接将其用作速率限制器组合密钥。
  2. 如果用户只发送JWT令牌,您可以验证它的声明以获取用户ID,假设它嵌入在令牌中,使用相同的密钥在Authn服务中生成JWT令牌作为Zuul网关应用程序属性(使用OS env凭据,保险库等)。或者您可以使用令牌作为用户ID。
  3. 将授权逻辑移动到Spring zuul ratimiter服务。它将验证作者的传入请求

也可以使用不同的redis实例作为rratimit密钥存储。

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

 类似资料:
  • 我在用 Linux 编写的 CUDA 代码中使用了一个库(该库称为 cublas),我可以使用 nvcc 成功编译我的代码,但是当我运行代码时出现此错误: 加载共享库时出错:libcublas.so.7.5:无法打开共享对象文件:没有这样的文件或目录 我发现此链接是一种解决方案,建议运行一些命令以解决问题。基于此链接的一种解决方案是运行以下命令: export LD_LIBRARY_PATH=$L

  • 问题内容: 我正在尝试在办公室笔记本电脑上安装JDK,但是它说我需要管理员权限。我只能在工作中使用自己的帐户。 没有管理员权限的情况下如何安装Java开发套件? 问题答案: 这是一种在没有管理员特权或没有管理员密码的情况下安装Java的解决方法。为此,您需要安装不需要管理员特权的cygwin。在utils中,确保您选择cabextract.exe进行安装。 启动Cygwin Bash外壳。 键入c

  • 我想为android清单做一个权限这个权限是 我的问题是,在没有用户干预的情况下,如何做到这一点?

  • 问题内容: 我是Python的新手,正在尝试安装此模块:http : //www.catonmat.net/blog/python-library-for-google- search/ 目录中没有setup.py,但是有以下文件: 有人可以告诉我如何设置或使用此模块吗? 谢谢! 问题答案: 在系统上开始使用该代码的最简单方法是: 将文件放入计算机上的目录中, 将该目录的路径添加到您的PYTHON

  • 假设我有一个web应用程序(“MyDriveApp”)需要在后台服务中访问驱动器文件。它要么拥有正在访问的文件,要么在所有者共享文档的谷歌账户中运行。 我明白我的应用程序需要一个刷新令牌,但我不想编写代码来获得它,因为我只会做一次。 注意。这不是使用服务帐户。该应用程序将在一个传统的谷歌账户下运行。服务帐户在某些情况下是一种有效的方法。然而,使用Oauth Playground来模拟应用程序的技术

  • [ERROR]无法执行goal org.springframework.boot:spring-boot-maven-plugin:2.1.1。release:repackage(repackage)on project project-data:goal org.springframework.boot:spring-boot-maven-plugin:2.1.1。release:repacka