深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题

简介: 本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。

theme: greenwillow

深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题

最近在配置 Spring Security 的过程中,有小伙伴遇到了关于 CSRF 启用与路径匹配器 requestMatchers 的相关问题。本文将从问题的根源出发,分析 Spring Security 不同版本中的变化,同时提供详细的解决方案。希望这篇博客能帮助大家快速解决类似问题,并深入理解 Spring Security 的相关机制。

image.png

问题 1:CSRF 的启用方法报错

背景: 在 Spring Security 的配置中,很多开发者会禁用 CSRF(跨站请求伪造)保护以方便调试或快速开发:

http.csrf(csrf -> csrf.disable());

后来开发者发现需要重新启用 CSRF 时,尝试使用如下代码:

http.csrf(csrf -> csrf.enable());

报错信息

无法解析 'CsrfConfigurer' 中的方法 'enable'

原因分析: Spring Security 的 CsrfConfigurer 类中并没有提供 enable() 方法。事实上,Spring Security 默认是启用 CSRF 的,因此并不需要显式地调用 enable() 方法。

解决方案

如果之前禁用了 CSRF,现在需要重新启用,只需要移除 .csrf(csrf -> csrf.disable()) 配置即可。默认情况下,CSRF 是开启的。

具体配置代码如下:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
   
    http
        .csrf() // 保持默认的 CSRF 启用状态
        .and()
        .authorizeHttpRequests(auth -> auth
            .requestMatchers("/login", "/api/users/register", "/error").permitAll()
            .anyRequest().authenticated()
        );
    return http.build();
}

注意:如果需要对某些路径禁用 CSRF,可以通过 ignoringRequestMatchers() 方法实现:

.csrf(csrf -> csrf
    .ignoringRequestMatchers("/api/ignore-csrf")
)

问题 2:requestMatchers 多路径匹配报错

背景: 开发者尝试配置路径权限时,使用了 requestMatchers 方法,并传入多个路径进行匹配:

.authorizeHttpRequests(auth -> auth
    .requestMatchers("/login", "/api/users/register", "/error", "/css/**", "/js/**", "/images/**").permitAll()
    .anyRequest().authenticated()
)

报错信息

无法解析方法 'requestMatchers(String, String, String, String, String, String)'

原因分析: 在 Spring Security 6.x 中,requestMatchers() 方法的签名发生了变化,不再支持传入多个字符串参数。这种变化是为了提升灵活性,同时统一方法行为。

在 Spring Security 6.x 中,requestMatchers() 方法的典型用法如下:

  1. 接收单个路径:

    .requestMatchers("/login")
    
  2. 接收 RequestMatcher 类型的对象:

    .requestMatchers(new AntPathRequestMatcher("/css/**"))
    

因此,传入多个字符串路径的方式在新版中不被支持了。

解决方案

方案 1:分多次调用 requestMatchers()

最直接的方法是将每个路径分开调用 requestMatchers()

.authorizeHttpRequests(auth -> auth
    .requestMatchers("/login", "/api/users/register", "/error").permitAll()
    .requestMatchers("/css/**", "/js/**", "/images/**").permitAll()
    .anyRequest().authenticated()
)
方案 2:自定义匹配器

如果需要对多个路径进行集中匹配,可以通过 RequestMatcher 实现更复杂的逻辑。例如:

.authorizeHttpRequests(auth -> auth
    .requestMatchers(new OrRequestMatcher(
        new AntPathRequestMatcher("/login"),
        new AntPathRequestMatcher("/api/users/register"),
        new AntPathRequestMatcher("/error"),
        new AntPathRequestMatcher("/css/**"),
        new AntPathRequestMatcher("/js/**"),
        new AntPathRequestMatcher("/images/**")
    )).permitAll()
    .anyRequest().authenticated()
)
方案 3:降级使用 antMatchers()(仅适用于 Spring Security 5.x)

在 Spring Security 5.x 中,仍然可以使用 antMatchers() 方法,该方法支持多个路径参数:

.authorizeRequests()
    .antMatchers("/login", "/api/users/register", "/error", "/css/**", "/js/**", "/images/**").permitAll()
    .anyRequest().authenticated();

Spring Security 版本的兼容性提示

  1. Spring Security 5.x

    • 推荐使用 antMatchers() 配置路径权限。
    • 可以直接传入多个字符串路径参数。
  2. Spring Security 6.x

    • 推荐使用 requestMatchers()
    • 传入路径时需要单独调用或使用 RequestMatcher 组合。

要解决这些问题,建议先检查你的项目依赖中 Spring Security 的版本。如果使用 Spring Boot,请查看 spring-boot-starter-security 的版本。

通过如下方式确认 Spring Security 版本:

./mvnw dependency:tree | grep spring-security

总结

在 Spring Security 的升级过程中,API 的调整往往会带来一些配置上的困惑。尤其是在 Spring Security 6.x 中,requestMatchers 方法的变更使得原有配置可能会报错。

本文总结了以下关键点:

  1. Spring Security 默认启用了 CSRF,无需显式调用 enable() 方法。
  2. requestMatchers() 方法在 Spring Security 6.x 中签名发生变化,需根据新版的 API 规范进行调整。
  3. 在升级到 Spring Security 6.x 前,建议先了解主要 API 的变化,并对现有代码进行兼容性调整。
目录
相关文章
|
1月前
|
数据采集 人工智能 Java
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
DevDocs是一款基于智能爬虫技术的开源工具,支持1-5层深度网站结构解析,能将技术文档处理时间从数周缩短至几小时,并提供Markdown/JSON格式输出与AI工具无缝集成。
102 1
1天消化完Spring全家桶文档!DevDocs:一键深度解析开发文档,自动发现子URL并建立图谱
|
1月前
|
前端开发 安全 Java
Spring Boot 便利店销售系统项目分包设计解析
本文深入解析了基于Spring Boot的便利店销售系统分包设计,通过清晰的分层架构(表现层、业务逻辑层、数据访问层等)和模块化设计,提升了代码的可维护性、复用性和扩展性。具体分包结构包括`controller`、`service`、`repository`、`entity`、`dto`、`config`和`util`等模块,职责分明,便于团队协作与功能迭代。该设计为复杂企业级应用开发提供了实践参考。
67 0
|
2月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
134 0
|
1月前
|
Java 关系型数据库 MySQL
深入解析 @Transactional——Spring 事务管理的核心
本文深入解析了 Spring Boot 中 `@Transactional` 的工作机制、常见陷阱及最佳实践。作为事务管理的核心注解,`@Transactional` 确保数据库操作的原子性,避免数据不一致问题。文章通过示例讲解了其基本用法、默认回滚规则(仅未捕获的运行时异常触发回滚)、因 `try-catch` 或方法访问修饰符不当导致失效的情况,以及数据库引擎对事务的支持要求。最后总结了使用 `@Transactional` 的五大最佳实践,帮助开发者规避常见问题,提升项目稳定性与可靠性。
175 11
|
1月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
138 5
|
1月前
|
安全 Java 数据安全/隐私保护
Spring Security: 深入解析 AuthenticationSuccessHandler
本文深入解析了 Spring Security 中的 `AuthenticationSuccessHandler` 接口,它用于处理用户认证成功后的逻辑。通过实现该接口,开发者可自定义页面跳转、日志记录等功能。文章详细讲解了接口方法参数及使用场景,并提供了一个根据用户角色动态跳转页面的示例。结合 Spring Security 配置,展示了如何注册自定义的成功处理器,帮助开发者灵活应对认证后的多样化需求。
62 2
|
1月前
|
前端开发 IDE Java
Spring MVC 中因导入错误的 Model 类报错问题解析
在 Spring MVC 或 Spring Boot 开发中,若导入错误的 `Model` 类(如 `ch.qos.logback.core.model.Model`),会导致无法解析 `addAttribute` 方法的错误。正确类应为 `org.springframework.ui.Model`。此问题通常因 IDE 自动导入错误类引起。解决方法包括:删除错误导入、添加正确包路径、验证依赖及清理缓存。确保代码中正确使用 Spring 提供的 `Model` 接口以实现前后端数据传递。
71 0
|
6月前
|
安全 前端开发 JavaScript
什么是 CSRF 攻击?如何启用 CSRF 保护来抵御该攻击?
什么是 CSRF 攻击?如何启用 CSRF 保护来抵御该攻击?
795 5
|
6月前
|
存储 Web App开发 安全
如何防范 CSRF 攻击
CSRF(跨站请求伪造)攻击是一种常见的安全威胁。防范措施包括:使用Anti-CSRF Token、检查HTTP Referer、限制Cookie作用域、采用双重提交Cookie机制等,确保请求的合法性与安全性。
|
6月前
|
网络安全 数据安全/隐私保护
什么是 CSRF 攻击
CSRF(跨站请求伪造)攻击是指攻击者诱导用户点击恶意链接或提交表单,利用用户已登录的身份在目标网站上执行非授权操作,如转账、修改密码等。这种攻击通常通过嵌入恶意代码或链接实现。