【问题标题】:Spring Cloud Netflix Zuul, CSRF and Form SubmissionSpring Cloud Netflix Zuul、CSRF 和表单提交
【发布时间】:2016-09-30 01:45:31
【问题描述】:

我对 Spring Cloud 和 CSRF 保护有一些问题。 我使用 Spring Cloud Security、OAuth2 等保护了我的应用程序(网关和注册服务)。

我授予每个人 (permitAll) 对 /signup 的访问权限,这是网关路由到实际注册服务的位置。我还授予注册服务器本身上的每个人的访问权限。这按预期工作。

让我头疼的是 CSRF 保护。网关和注册服务都自己创建一个 CSRF 令牌。来自网关的令牌将被发送到客户端,并且来自注册服务的令牌丢失(在网关的某处)。

如果我向注册服务发布内容,CSRF 保护会启动并说令牌为空,或者实际值与预期值不匹配,如果我尝试重用来自网关的值,这是可用的在 HTTP 标头中。

我已经让它在注册服务上禁用 CSRF,但它似乎不是正确的解决方案,因为它仅在有人从客户端发回令牌时才有效,例如 Angular SPA。当我尝试从浏览器提交表单(在注册服务上呈现)时,由于缺少 _csrf 参数而失败。 如果我在注册服务上激活 CSRF 并将 _csrf 参数添加到表单中,网关的 CSRF 保护就会启动并说实际令牌与预期不匹配,这是绝对正确的,因为实际令牌是一个来自注册服务,而预期的令牌来自网关。

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

我已经在 HttpSecurity.csrf() 配置中尝试了 ignoreAntMatchers() ,我可以在其中排除特定路径,但这对我也没有帮助。期望值是完全不同的东西。似乎为 POST 请求创建了一个新会话。

那么我有没有机会在网关上使用 CSRF 并同时使用带有表单提交和 Zuul 的注册服务?

【问题讨论】:

  • 你找到解决办法了吗?

标签: spring-security spring-boot csrf spring-cloud spring-cloud-security


【解决方案1】:

你应该可以让它工作:我认为应该在 Zuul 中禁用 CSRF,并且 Zuul 应该从服务中转发原始的 CSRF 令牌。

您是否尝试设置自定义“敏感标头”以避免丢失令牌?由于默认配置是删除任何“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2018-08-25
    • 2016-03-09
    • 1970-01-01
    • 2021-09-07
    • 2020-07-19
    • 1970-01-01
    相关资源
    最近更新 更多