Spring security Spring Cloud Netflix Zuul、CSRF和表单提交

Spring security Spring Cloud Netflix Zuul、CSRF和表单提交,spring-security,spring-boot,csrf,spring-cloud,spring-cloud-security,Spring Security,Spring Boot,Csrf,Spring Cloud,Spring Cloud Security,我对Spring Cloud和CSRF保护有一些问题。 我用SpringCloudSecurity、OAuth2等保护了我的应用程序(一个网关和一个注册服务) 我向每个人(permitAll)授予了访问/注册的权限,这是网关路由到实际注册服务的地方。我还向注册服务器上的所有人授予了访问权限。这正如预期的那样有效 让我头疼的是CSRF保护。网关和注册服务都自己创建CSRF令牌。来自网关的令牌将被发送到客户端,来自注册服务的令牌将丢失(位于网关的某个位置) 如果我向注册服务发布了一些内容,CSRF保

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

我向每个人(permitAll)授予了访问/注册的权限,这是网关路由到实际注册服务的地方。我还向注册服务器上的所有人授予了访问权限。这正如预期的那样有效

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

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

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

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

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


那么,我是否有可能在网关上使用CSRF,同时使用表单提交和Zuul的注册服务?

您应该能够让它正常工作:我认为在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

你找到解决这个问题的办法了吗?