Spring Security创建SecurityFilterChain Bean时依赖注入失败求助
解决Spring Security中SecurityFilterChain创建的请求匹配器错误
问题原因
Spring Security 6.x(对应Spring Boot 3.x版本)对请求匹配器的使用做了严格限制:当直接使用requestMatchers("/path/**")这种字符串路径写法时,框架无法自动判断该路径属于Spring MVC端点还是其他类型请求,因此抛出错误,要求明确指定匹配器类型。
解决方案
方案一:使用MvcRequestMatcher(推荐,适配Spring MVC端点)
由于项目引入了spring-boot-starter-web,属于Spring MVC项目,建议使用MvcRequestMatcher。需要注入HandlerMappingIntrospector来构建匹配器:
修改后的SecurityConfiguration.java:
@Configuration @EnableWebSecurity public class SecurityConfiguration { @Autowired private AuthenticationProvider authenticationProvider; @Autowired private JwtAuthenticationFilter jwtAuthenticationFilter; @Autowired private UserDetailsService userDetailsService; @Autowired private HandlerMappingIntrospector handlerMappingIntrospector; @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception{ MvcRequestMatcher.Builder mvcMatcherBuilder = new MvcRequestMatcher.Builder(handlerMappingIntrospector); http.csrf() .disable() .authorizeHttpRequests(auth -> auth .requestMatchers(mvcMatcherBuilder.pattern("/auth/**")).permitAll() .anyRequest().authenticated()) .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authenticationProvider(authenticationProvider) .addFilterBefore(jwtAuthenticationFilter , UsernamePasswordAuthenticationFilter.class); return http.build(); } }
方案二:使用AntPathRequestMatcher
如果不需要Spring MVC的路径匹配规则(比如非MVC端点),可以直接实例化AntPathRequestMatcher:
修改securityFilterChain方法中的请求匹配部分:
.authorizeHttpRequests() .requestMatchers(new AntPathRequestMatcher("/auth/**")) .permitAll() .anyRequest() .authenticated()
额外优化:清理重复依赖
你的pom.xml中重复引入了jjwt-api依赖,建议删除其中一个,避免潜在的依赖冲突:
删除以下重复的依赖块:
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency>
内容的提问来源于stack exchange,提问作者mr hearvy
相关产品推荐
相关产品推荐

