我尝试为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证据处理程序而无法验证该值)。
1条答案
按热度按时间vcudknz31#
简短回答:RTFM并仔细检查您导入的
CsrfToken
(有一个用于WebMVC,另一个与另一个用于WebFlux的包不同)设置CSRF cookie
从Sping Boot 3(spring-security 6)开始,必须提供一个过滤器来将CSRF cookie添加到响应中,
Cookie(Server)CsrfTokenRepository
已经不够了。这里针对servlet记录了这一点,那里针对React式应用程序记录了这一点。此文档包含每种情况下复制/粘贴的确切配置。
另外,根据应用程序的性质导入正确的
CsrfToken
时要非常小心,否则标记将为空:request / exchange属性的名称为CsrfToken.class.getName()
,您可以从org.springframework.security.web.csrf
或org.springframework.security.web.server.csrf
导入该属性,而不会出现任何编译错误(第一个将用于servlet,第二个将用于webflux)。这就是添加过滤器后未设置cookie的原因:我在WebFilter
中引用了servlet的导入=〉CSRF标记值未解析。正确验证CSRF令牌
如文档中所述,应将
Xor(Server)CsrfTokenRequestAttributeHandler
的handle
方法用作csrf请求处理程序(仅限handle
方法,而非完整的Xor(Server)CsrfTokenRequestAttributeHandler
示例)