Spring Boot中Postman调用登录接口返回403,但浏览器认证正常
问题分析与解决方案
核心问题:冲突的Spring Security配置
你的SecurityConfig类中存在两个HttpSecurity配置,但只有filterChain这个@Bean会被Spring Security加载生效。这个Bean的规则要求所有请求必须经过认证,包括POST /login接口,因此调用时直接返回403。而你编写的protected void configure(HttpSecurity http)方法因未标记为@Bean,也未被配置类机制触发,完全未生效。
修复步骤
1. 统一Security配置到SecurityFilterChain Bean
删除无用的configure(HttpSecurity http)方法,将允许/login接口匿名访问的规则整合到filterChain Bean中:
@Configuration public class SecurityConfig { @Autowired private UserDetailsServiceImpl userDetailsService; @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.cors() .and() .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .authorizeHttpRequests(authz -> authz .requestMatchers(HttpMethod.POST, "/login").permitAll() // 允许登录接口匿名访问 .anyRequest().authenticated() ) .httpBasic(withDefaults()); return http.build(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); } @Bean public AuthenticationManager getAuthenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { return authenticationConfiguration.getAuthenticationManager(); } }
2. 验证密码加密规则
确保数据库中存储的用户密码是通过BCryptPasswordEncoder加密后的字符串。若密码为明文存储,后续认证会失败,需提前处理。
3. 检查Postman请求格式
确保POST /login请求符合要求:
- 请求头设置
Content-Type: application/json - 请求体为JSON格式,示例:
{ "username": "你的用户名", "password": "你的密码" }
后续扩展
修复登录接口403问题后,需添加JWT过滤器来验证其他接口的Token,拦截除/login外的所有请求并校验Token有效性。
内容的提问来源于stack exchange,提问作者caged_raven_wings
相关产品推荐
相关产品推荐

