Spring Security Angular的spring-云网关上的CSRF配置

aoyhnmkz  于 2023-03-18  发布在  Spring
关注(0)|答案(1)|浏览(150)

我尝试为React式应用程序修改文档(spring-cloud-gateway用作BFF),并将其配置为OAuth2客户端,其中包含:

http.csrf().csrfTokenRepository(CookieServerCsrfTokenRepository.withHttpOnlyFalse())
        .csrfTokenRequestHandler(new XorServerCsrfTokenRequestAttributeHandler()::handle);

但我仍然有一个“一个预期的CSRF令牌找不到”的错误,实际上,我找不到XSRF-TOKEN cookie是我的浏览器调试工具。
然后我定义了这样一个WebFilter

@Bean
WebFilter csrfCookieWebFilter() {
    return (exchange, chain) -> {
        Mono<CsrfToken> csrfToken = exchange.getAttributeOrDefault(CsrfToken.class.getName(), Mono.empty());
        return csrfToken.doOnSuccess(token -> {
        }).then(chain.filter(exchange));
    };
}

我现在有一个XSRF-TOKEN cookie,但也有一个“无效的CSRF令牌”错误。
那么,CookieServerCsrfTokenRepository到底是什么?为什么我在spring-cloud-gateway上找不到CSRF令牌cookie?
我应该如何配置我的spring-cloud-gateway来允许从Angular应用程序到/logout端点的PUT请求?

编辑

由于1.5个月前曾提出过非常相似的问题,但至今仍未得到答复:“Angular app served behind Spring Cloud Gateway cannot send POST requests to backend because of invalid CSRF token“,我开了一张 Spring 安全的票:https://github.com/spring-projects/spring-security/issues/12871
另一个问题是缺少我链接的文档中的部分,但它仍然应该生成CSRF cookie(即使由于新的BREACH证据处理程序而无法验证该值)。

vcudknz3

vcudknz31#

简短回答:RTFM并仔细检查您导入的CsrfToken(有一个用于WebMVC,另一个与另一个用于WebFlux的包不同)

从Sping Boot 3(spring-security 6)开始,必须提供一个过滤器来将CSRF cookie添加到响应中,Cookie(Server)CsrfTokenRepository已经不够了。
这里针对servlet记录了这一点,那里针对React式应用程序记录了这一点。此文档包含每种情况下复制/粘贴的确切配置
另外,根据应用程序的性质导入正确的CsrfToken时要非常小心,否则标记将为空:request / exchange属性的名称为CsrfToken.class.getName(),您可以从org.springframework.security.web.csrforg.springframework.security.web.server.csrf导入该属性,而不会出现任何编译错误(第一个将用于servlet,第二个将用于webflux)。这就是添加过滤器后未设置cookie的原因:我在WebFilter中引用了servlet的导入=〉CSRF标记值未解析

正确验证CSRF令牌

如文档中所述,应将Xor(Server)CsrfTokenRequestAttributeHandlerhandle方法用作csrf请求处理程序(仅限handle方法,而非完整的Xor(Server)CsrfTokenRequestAttributeHandler示例)

相关问题