You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot 3.1.1升级后authorizeHttpRequests替代遇401授权问题

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 14:10:39