为特定 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 来自 getURLsForDisabledCSRFAndServerWebExchangeMatcher,它结合了默认的 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"))
)