为特定 URL SPA 禁用 CSRF Spring Gateway WebFlux
Disable CSRF for specific URLs SPA Spring Gateway WebFlux
我在 WebFilterChain 中有下一个 CSRF 代码:
.csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())
.requireCsrfProtectionMatcher(getURLsForDisabledCSRF())
我想关闭对多个 URL 的 POST 方法的 CSRF 检查。我找到了 NegatedServerWebExchangeMatcher,它允许进行下一步操作:
return new NegatedServerWebExchangeMatcher(ServerWebExchangeMatchers.pathMatchers(
HttpMethod.POST, "/services/service1/api/some-post-endpoint1",
"/services/service1/api/some-post-endpoint2");
总的来说这段代码有效,但是当我尝试获取请求登录页面或域页面时,我会得到 'Invalid CSRF' 或 'Expected CSRF cannot be found'。同样在 Spa 尝试将我重定向到 index.html 之后,此 GET 重定向请求上将出现 403,它表示:无效的 CSRF 或未提供 CSRF。
设置 requireCsrfProtectionMatcher
时,您覆盖了允许 GET
请求的默认配置。
如果您想同时使用两者,您可以 return 来自 getURLsForDisabledCSRF
的 AndServerWebExchangeMatcher
,它结合了默认的 CSRF 匹配器和您自定义的匹配器。
new AndServerWebExchangeMatcher(
CsrfWebFilter.DEFAULT_CSRF_MATCHER,
new NegatedServerWebExchangeMatcher(ServerWebExchangeMatchers.pathMatchers(HttpMethod.POST,
"/services/service1/api/some-post-endpoint1",
"/services/service1/api/some-post-endpoint2"))
)
我在 WebFilterChain 中有下一个 CSRF 代码:
.csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())
.requireCsrfProtectionMatcher(getURLsForDisabledCSRF())
我想关闭对多个 URL 的 POST 方法的 CSRF 检查。我找到了 NegatedServerWebExchangeMatcher,它允许进行下一步操作:
return new NegatedServerWebExchangeMatcher(ServerWebExchangeMatchers.pathMatchers(
HttpMethod.POST, "/services/service1/api/some-post-endpoint1",
"/services/service1/api/some-post-endpoint2");
总的来说这段代码有效,但是当我尝试获取请求登录页面或域页面时,我会得到 'Invalid CSRF' 或 'Expected CSRF cannot be found'。同样在 Spa 尝试将我重定向到 index.html 之后,此 GET 重定向请求上将出现 403,它表示:无效的 CSRF 或未提供 CSRF。
设置 requireCsrfProtectionMatcher
时,您覆盖了允许 GET
请求的默认配置。
如果您想同时使用两者,您可以 return 来自 getURLsForDisabledCSRF
的 AndServerWebExchangeMatcher
,它结合了默认的 CSRF 匹配器和您自定义的匹配器。
new AndServerWebExchangeMatcher(
CsrfWebFilter.DEFAULT_CSRF_MATCHER,
new NegatedServerWebExchangeMatcher(ServerWebExchangeMatchers.pathMatchers(HttpMethod.POST,
"/services/service1/api/some-post-endpoint1",
"/services/service1/api/some-post-endpoint2"))
)