Spring Security条件化CSRF保护实现 适配Web与移动端多端访问需求
Spring Boot 同接口兼容Web端CSRF校验与移动端免校验实现方案
有成熟的实现方案,Spring Security原生支持灵活配置CSRF校验规则,以下是两种常用的落地方式:
方案1:基于授权类型自动跳过Bearer Token请求的CSRF校验(最推荐)
该方案无需修改现有接口路径,可自动适配所有同时供Web端、移动端调用的接口,安全逻辑完备。
CSRF攻击仅能触发浏览器自动携带同域Cookie,无法主动添加自定义的Authorization请求头,因此所有携带Bearer Token的请求本身不存在CSRF风险,可直接配置Spring Security跳过这类请求的校验,适配Spring Security 6+的代码示例如下:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf // 所有携带Bearer Token的请求跳过CSRF校验 .ignoringRequestMatchers(request -> { String authHeader = request.getHeader("Authorization"); return authHeader != null && authHeader.startsWith("Bearer "); }) ) // 其余原有配置保持不变:Cookie会话管理、授权规则、Bearer Token校验等 .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)) .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())); return http.build(); } }
配置后Web端使用Cookie授权的请求仍会走正常CSRF校验流程,移动端携带Bearer Token的请求自动跳过校验,两端逻辑互不干扰。
方案2:针对指定接口路径跳过CSRF校验
如果你仅需要开放少量特定接口给移动端调用,可以直接指定对应路径忽略CSRF校验,代码示例如下:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf // 仅指定用户数据修改接口跳过CSRF校验,可按需替换为你的实际接口路径 .ignoringRequestMatchers("/api/user/profile/update") ) // 其余原有配置保持不变 .authorizeHttpRequests(auth -> auth.anyRequest().authenticated()); return http.build(); }
注意选择该方案时需确保对应接口的权限校验逻辑完整,必须通过身份授权后才能调用,避免出现未授权访问漏洞。
安全性说明
移动端的Bearer Token一般存储在应用本地沙箱中,第三方应用无法伪造请求自动携带该Token,因此移动端请求跳过CSRF校验不存在安全风险。
内容的提问来源于stack exchange,提问作者Vrezh Arakelyan
相关产品推荐
相关产品推荐

