You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Keycloak发起POST请求时提示CSRF令牌缺失的问题排查

你的POST请求出现CSRF错误,这个问题和Keycloak配置无关——Keycloak作为授权服务器仅负责发放JWT令牌,不干预资源服务或网关的CSRF防护逻辑。以下是你需要排查的核心遗漏点:


1. 网关(Reactive环境)未正确禁用CSRF

你的网关配置了web-application-type: reactive,属于响应式Web环境,Servlet环境的csrf.disable()配置不生效,必须通过ServerHttpSecurity专门配置:

创建网关的Security配置类:

@Configuration
@EnableWebFluxSecurity
public class GatewaySecurityConfig {
    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        http.csrf(csrf -> csrf.disable())
            .oauth2Login(withDefaults())
            .oauth2Client(withDefaults());
        return http.build();
    }
}

注:如果网关同时作为OAuth2客户端(你的配置里是授权码模式),必须保留oauth2Login和oauth2Client配置,否则TokenRelay过滤器无法正常工作。

2. 确认所有微服务的CSRF禁用逻辑生效

虽然你在product-service里配置了csrf.disable(),但需检查:

  • 是否所有微服务的SecurityFilterChain都明确禁用了CSRF,没有遗漏其他服务;
  • 配置的requestMatchers是否覆盖了所有POST请求路径,避免部分路径未应用禁用规则;
  • 检查是否存在其他Spring Security配置类(比如自动配置的)覆盖了你的自定义配置,可通过Spring Boot Actuator的/actuator/beans端点查看SecurityFilterChain的实例优先级。

3. TokenRelay过滤器是否正确转发JWT令牌

POST请求失败可能是网关未正确将JWT令牌转发到后端服务:

  • 确认网关的TokenRelay过滤器配置正确(你的配置里写法是TokenRelay=,正确格式应为- TokenRelay,注意YAML的列表格式);
  • 在Postman中检查请求头,确认Authorization: Bearer <token>是否被正确携带到后端服务(可通过网关的TRACE日志查看请求头转发情况);
  • 授权码模式下,网关获取的令牌是否包含message.write权限(你的product-service要求SCOPE_message.write权限,POST请求通常需要写权限,需确认Keycloak客户端的scope配置是否包含该权限,且用户已被授予对应角色)。

4. 检查Spring Security版本兼容性

部分旧版本的Spring Security在Reactive环境下,CSRF禁用逻辑存在bug,建议确认你的Spring Cloud和Spring Security版本是否匹配(比如Spring Cloud 2022.0.x对应Spring Security 6.x),避免版本冲突导致的配置不生效。

5. 排查第三方依赖或自定义过滤器

检查是否引入了其他带有CSRF防护的依赖(比如Spring Session),或者自定义的拦截器/过滤器中添加了CSRF校验逻辑,这些可能会覆盖你禁用CSRF的配置。


内容的提问来源于stack exchange,提问作者Treefrog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 20:24:53