Spring Security 6配置问题:/registration接口返回401 Unauthorized
问题分析与解决
问题描述
配置Spring Security 6安全类时,已设置/registration/**允许匿名访问,但向http://localhost:8080/registration发送POST请求时,仍返回401 Unauthorized响应。
错误原因
你在配置SecurityFilterChain时两次调用了authorizeHttpRequests方法,这会导致第一次配置的/registration/** permitAll规则被覆盖,无法生效。
Spring Security 6中,每次调用authorizeHttpRequests都会生成一个新的授权配置实例,而非在原有配置上追加规则。你的第二个authorizeHttpRequests仅定义了/users/**的权限规则,未包含/registration/**的放行规则,因此所有未匹配/users/**的请求都会触发默认的认证要求,导致/registration的POST请求被拦截。
修正后的安全配置代码
package io.chernikov.registerme.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; /** * Security configuration class. * * @author Serhii Chernikov * @version 1.0 */ @Configuration @EnableWebSecurity public class SecurityConfiguration { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http .cors(AbstractHttpConfigurer::disable) .csrf(AbstractHttpConfigurer::disable) // 将所有授权规则合并到同一个authorizeHttpRequests调用中 .authorizeHttpRequests(authorization -> authorization .requestMatchers("/registration/**").permitAll() .requestMatchers("/users/**").hasAnyAuthority("USER", "ADMIN") // 明确其他所有请求需要认证(可选,但推荐添加以避免歧义) .anyRequest().authenticated() ) .httpBasic(Customizer.withDefaults()) .formLogin(Customizer.withDefaults()) .build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
额外说明
你的控制器路径配置是正确的:@RequestMapping("/registration")配合@PostMapping("/")对应路径/registration/,/registration/**的规则完全可以匹配该路径,无需调整控制器的路径配置。
内容的提问来源于stack exchange,提问作者Serhii Chernikov
相关产品推荐
相关产品推荐

