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

Spring Boot POST请求授权失败(401)问题排查求助

问题分析与解决方案

核心问题

你的SecurityConfig类中的filterChain方法没有添加@Bean注解,导致Spring容器未加载这个自定义安全配置,仍在使用默认Security规则——默认情况下CSRF是开启的,这就是日志中还出现CSRF校验错误的原因,同时你的授权规则也未生效。

修复步骤

  1. 给filterChain方法添加@Bean注解
    修改后的SecurityConfig代码如下:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig {
    
        @Bean
        PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    
        @Bean // 必须添加此注解,让Spring加载该配置
        public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            http
                    .csrf((csrf) -> csrf.disable())
                    .authorizeHttpRequests((authz) -> authz
                            .requestMatchers(HttpMethod.GET, "/api/**").permitAll()
                            .anyRequest().authenticated()
                    )
                    .httpBasic(Customizer.withDefaults());
    
            return http.build();
        }
    
        @Bean
        public UserDetailsService users() {
            UserDetails user = User.builder()
                    .username("user")
                    .password(passwordEncoder().encode("pass"))
                    .roles("USER")
                    .build();
            UserDetails admin = User.builder()
                    .username("admin")
                    .password(passwordEncoder().encode("admin"))
                    .roles("USER", "ADMIN")
                    .build();
            return new InMemoryUserDetailsManager(user, admin);
        }
    
    }
    
  2. 验证请求的认证信息
    控制器方法使用@PreAuthorize("hasRole(ADMIN)"),需确保请求时使用admin用户(拥有ADMIN角色)发送Basic认证信息:

    • 工具(如Postman)中选择Basic Auth,输入用户名admin、密码admin
    • 手动构造请求头:Authorization: Basic YWRtaW46YWRtaW4=(admin:admin的Base64编码)
  3. 确认请求路径匹配
    控制器的@PostMapping若未指定路径,需确保请求URL与控制器类上@RequestMapping指定的路径(比如/api/posts)一致,匹配配置中的规则。

日志现象解释

之前日志中出现Invalid CSRF token found,是因为自定义SecurityFilterChain未被加载,Spring使用默认配置(CSRF开启),POST请求被CSRF拦截返回403,随后请求转发到/error端点,该端点需要认证,因此最终返回401状态码,导致你看到的现象。

内容的提问来源于stack exchange,提问作者Shredder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:32:45