CsrfFilter中requireCsrfProtectionMatcher初始化规则及使用DefaultRequiresCsrfMatcher方法
匹配器初始化依据
Spring Security中CsrfFilter的requireCsrfProtectionMatcher默认初始化逻辑如下:
- 默认会构造
AndRequestMatcher组合两个校验规则,只有同时满足两个规则的请求才会触发CSRF校验:- 规则1:
DefaultRequiresCsrfMatcher,仅匹配POST、PUT、DELETE、PATCH四类不安全的HTTP方法,GET、HEAD、OPTIONS、TRACE类请求直接跳过CSRF校验 - 规则2:会话/凭证校验规则,当你配置了
SessionCreationPolicy.STATELESS无状态会话策略+JWT资源服务时,该规则默认仅对携带会话Cookie的请求生效,无Cookie的JWT请求默认不会触发CSRF校验
两个规则做逻辑与,所以你看到的初始化结果是AndRequestMatcher实例。
- 规则1:
配置调整方案
你只需要显式指定CSRF校验的匹配器为DefaultRequiresCsrfMatcher即可,修改后的配置代码如下:
@Override protected void configure(HttpSecurity http) throws Exception { http.csrf() // 显式指定仅使用DefaultRequiresCsrfMatcher做CSRF校验匹配 .requireCsrfProtectionMatcher(new CsrfFilter.DefaultRequiresCsrfMatcher()) .and().cors() .and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeRequests() .antMatchers("/rest/open/**").permitAll() .antMatchers("/**").authenticated() .anyRequest().permitAll() .and() .oauth2ResourceServer() .jwt() .jwtAuthenticationConverter(getJwtAuthoritiesConverter()); }
调整后所有POST、PUT、DELETE、PATCH类型的请求都会触发CSRF校验,不再受会话策略、是否携带Cookie的影响,完全符合你的需求。
内容的提问来源于stack exchange,提问作者ysn
相关产品推荐
相关产品推荐

