Spring Boot POST请求授权失败(401)问题排查求助
问题分析与解决方案
核心问题
你的SecurityConfig类中的filterChain方法没有添加@Bean注解,导致Spring容器未加载这个自定义安全配置,仍在使用默认Security规则——默认情况下CSRF是开启的,这就是日志中还出现CSRF校验错误的原因,同时你的授权规则也未生效。
修复步骤
给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); } }验证请求的认证信息
控制器方法使用@PreAuthorize("hasRole(ADMIN)"),需确保请求时使用admin用户(拥有ADMIN角色)发送Basic认证信息:- 工具(如Postman)中选择Basic Auth,输入用户名
admin、密码admin - 手动构造请求头:
Authorization: Basic YWRtaW46YWRtaW4=(admin:admin的Base64编码)
- 工具(如Postman)中选择Basic Auth,输入用户名
确认请求路径匹配
控制器的@PostMapping若未指定路径,需确保请求URL与控制器类上@RequestMapping指定的路径(比如/api/posts)一致,匹配配置中的规则。
日志现象解释
之前日志中出现Invalid CSRF token found,是因为自定义SecurityFilterChain未被加载,Spring使用默认配置(CSRF开启),POST请求被CSRF拦截返回403,随后请求转发到/error端点,该端点需要认证,因此最终返回401状态码,导致你看到的现象。
内容的提问来源于stack exchange,提问作者Shredder
相关产品推荐
相关产品推荐

