Spring Boot 3.1.1升级后authorizeHttpRequests替代遇401授权问题
问题根源
旧版authorizeRequests(基于ExpressionInterceptUrlRegistry)的默认逻辑是:未被明确匹配的请求会自动放行;而新版authorizeHttpRequests(基于AuthorizationManagerRequestMatcherRegistry)的默认逻辑是:所有未被明确匹配的请求都要求认证,这就是api/markets这类未配置的请求返回401的核心原因。
解决方案
在authorizeUrlsNew方法的规则末尾添加.anyRequest().permitAll(),明确放行所有未匹配的请求。同时要保证规则顺序:更具体的请求匹配规则放在前面,通用规则放在最后——因为规则按顺序匹配,先匹配到的规则会优先生效。
调整后的关键代码
@Bean protected SecurityFilterChain configure(HttpSecurity http) throws Exception { return http .authorizeHttpRequests(this::authorizeUrlsNew) // 现在可正常工作 .csrf(AbstractHttpConfigurer::disable) .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class) .build(); } private void authorizeUrlsNew(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry matcherReg) { matcherReg .requestMatchers("api/admin/authenticate").permitAll() .requestMatchers("api/admin/authenticate/captcha").permitAll() .requestMatchers("api/admin/**").authenticated() .anyRequest().permitAll(); // 添加此行,放行未匹配的请求 }
额外说明
- 如果你的非/admin路径也需要JWT认证(比如前端接口),可将
.anyRequest().permitAll()替换为.anyRequest().authenticated(),此时JWTFilter会负责验证token并注入认证信息,确保合法请求正常通过。 - 建议给
requestMatchers的路径加上斜杠前缀(如"/api/admin/authenticate"),避免路径匹配歧义。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

