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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 20:57:06