Spring Boot 3.2.1注册接口401未授权问题求助
问题分析与解决方案
核心问题
你的注册接口实际请求路径是POST /registration/customer,但Security配置里放行的路径是/api/registration/**,两者不匹配,导致该请求未被纳入放行规则,仍然触发HTTP Basic认证,最终返回401。同时,原配置缺少对其他接口的授权规则,默认情况下Spring Security会拒绝所有未明确授权的请求。
修正后的配置代码
@Configuration public class FoodDeliverySecurityConfig { @Bean public BCryptPasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } @Bean public UserDetailsManager userDetailsManager(DataSource dataSource){ JdbcUserDetailsManager jdbcUserDetailsManager = new JdbcUserDetailsManager(dataSource); jdbcUserDetailsManager.setUsersByUsernameQuery("select email, password from user where email = ?"); jdbcUserDetailsManager.setAuthoritiesByUsernameQuery("select email, user_type from user where email = ?"); return jdbcUserDetailsManager; } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(configurer -> configurer // 放行注册接口,路径与实际请求保持一致 .requestMatchers(HttpMethod.POST, "/registration/**").permitAll() // 要求所有其他接口必须认证后才能访问 .anyRequest().authenticated()); // 启用HTTP Basic认证 http.httpBasic(Customizer.withDefaults()); // 禁用CSRF适配无状态API http.csrf(csrf -> csrf.disable()); return http.build(); } }
关键修改点
- 修正路径匹配:将放行路径改为
/registration/**,确保和实际请求路径/registration/customer匹配;如果你的接口设计应为/api/registration/customer,则保持配置路径不变,调整请求路径即可。 - 补充全局授权规则:增加
.anyRequest().authenticated(),明确所有未被放行的接口必须经过认证才能访问,契合“保护所有接口但允许注册接口匿名访问”的需求。
错误日志佐证
从日志中可以看到:
2024-02-03T12:42:42.314+05:30 DEBUG 96098 --- [nio-8082-exec-1] o.s.security.web.FilterChainProxy : Securing POST /registration/customer
Spring Security正在对/registration/customer请求进行安全校验,说明该路径未被原放行规则匹配到,修正路径后即可解决问题。
内容的提问来源于stack exchange,提问作者Arpita
相关产品推荐
相关产品推荐

