Spring Security Basic Auth:Postman获取的JSESSIONID Cookie无法授权后续请求(401错误)
Spring Security 3.1.0 会话认证失效问题解决
问题概述
在Spring Security 3.1.0应用中,通过Basic Auth认证成功访问受保护端点并获取JSESSIONID Cookie后,仅携带该Cookie再次访问同一端点时返回401未授权,不符合会话认证的预期行为。
问题根源
- AuthenticationManager配置错误:手动构建
AuthenticationManagerBuilder的方式未正确集成到Spring Security上下文,导致会话中存储的认证信息无法被正确读取和验证。 - 会话管理配置缺失:未显式配置会话认证相关策略,Spring Security默认的会话识别机制未正常生效。
- 授权规则拆分配置:两次调用
authorizeHttpRequests可能导致规则优先级冲突(虽非本次问题核心,但需规范)。
修复方案
修改SecurityConfig配置,调整AuthenticationManager初始化方式并完善会话管理:
修正后的配置代码
@Configuration @EnableWebSecurity(debug = true) public class SecurityConfig { @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } @Bean public UserDetailsService userDetailsService() { return new CustomUserDetailService(); } // 正确获取Spring Security上下文的AuthenticationManager @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception { return authenticationConfiguration.getAuthenticationManager(); } @Bean public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(requests -> requests .requestMatchers("/user/**").hasAnyRole("ADMIN") .requestMatchers("/teams/**").hasAnyRole("USER") .anyRequest().permitAll()) .formLogin(form -> form .loginPage("/loginuser") .permitAll() .defaultSuccessUrl("/home")) .httpBasic() .and() .csrf().disable() .headers(h -> h.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) // 显式配置会话管理,确保会话认证生效 .sessionManagement(session -> session .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .maximumSessions(1) .expiredUrl("/loginuser?expired")); return http.build(); } }
关键修改说明
- AuthenticationManager初始化:通过
AuthenticationConfiguration获取Spring Security自动配置的实例,保证会话认证时能正确加载用户认证信息。 - 合并授权规则:将分散的
authorizeHttpRequests调用合并,避免规则覆盖或优先级问题。 - 会话管理配置:明确会话创建策略,确保Spring Security识别JSESSIONID对应的已认证会话,完成自动认证。
验证步骤
- 在Postman中确保请求正确携带
JSESSIONIDCookie(值为之前认证成功返回的Cookie值)。 - 查看控制台debug日志,确认认证流程中是否正确识别会话中的认证信息。
- 验证
CustomUserDetailService实现是否正确,确保用户信息可被正常读取。
内容的提问来源于stack exchange,提问作者Vivek Mishra
相关产品推荐
相关产品推荐

