Spring Cloud Netflix Zuul,CSRF和表单提交

10

我在使用Spring Cloud和CSRF保护时遇到了一些问题。

我通过Spring Cloud Security,OAuth2等为我的应用程序(网关和注册服务)提供了安全保护。

我允许每个人(permitAll)访问/signup这个网关路由到实际注册服务的地方。我还允许每个人访问注册服务器本身。这正常工作。

让我头痛的是CSRF保护。网关和注册服务都会创建自己的CSRF令牌。网关的令牌将发送给客户端,而注册服务的令牌则丢失(某处在网关)。

如果我向注册服务提交内容,则CSRF保护会启动并表示令牌为null或实际值与预期值不匹配,如果我尝试重用来自网关的值(可在HTTP标头中获取)。

我已经通过禁用注册服务上的CSRF使其正常工作,但这似乎不是正确的解决方案,因为它只适用于某人从客户端发送令牌,例如Angular SPA。当我尝试从浏览器提交表单(在注册服务上呈现)时,由于缺少_csrf参数,此操作失败。

如果我在注册服务上激活CSRF并将_csrf参数添加到表单中,则网关的CSRF保护会启动并表示实际令牌与预期令牌不匹配,这是完全正确的,因为实际令牌来自注册服务,而预期令牌来自网关。

我可以禁用网关上的CSRF,但这将导致我必须在每个被REST客户端或SPA使用的服务上配置CSRF设置。

我尝试在HttpSecurity.csrf()配置中使用ignoreAntMatchers()来排除特定路径,但这也没有帮助我。预期值是完全不同的。似乎为POST请求创建了一个新会话。

那么,有没有可能一次使用CSRF,表单提交和Zuul在网关和注册服务上?


你找到了解决方案吗? - Mahmood
1个回答

0
你应该能够让它工作:我认为在Zuul中应该禁用CSRF,并且Zuul应该转发来自服务的原始CSRF令牌。
你是否尝试设置自定义的"sensitive-headers",以避免丢失令牌?由于默认配置是删除任何"Cookie"和"Set-Cookie"头,因此您需要进行更改:
zuul:
  routes:
    users:
      path: /myusers/**
      # This is the default value if not set
      sensitiveHeaders: Cookie,Set-Cookie,Authorization
      url: https://downstream

变成

zuul:
  routes:
    users:
      path: /myusers/**
      sensitiveHeaders: Authorization
      url: https://downstream

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接