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

Spring Security Basic Auth:Postman获取的JSESSIONID Cookie无法授权后续请求(401错误)

Spring Security 3.1.0 会话认证失效问题解决

问题概述

在Spring Security 3.1.0应用中,通过Basic Auth认证成功访问受保护端点并获取JSESSIONID Cookie后,仅携带该Cookie再次访问同一端点时返回401未授权,不符合会话认证的预期行为。

问题根源

  1. AuthenticationManager配置错误:手动构建AuthenticationManagerBuilder的方式未正确集成到Spring Security上下文,导致会话中存储的认证信息无法被正确读取和验证。
  2. 会话管理配置缺失:未显式配置会话认证相关策略,Spring Security默认的会话识别机制未正常生效。
  3. 授权规则拆分配置:两次调用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对应的已认证会话,完成自动认证。

验证步骤

  1. 在Postman中确保请求正确携带JSESSIONID Cookie(值为之前认证成功返回的Cookie值)。
  2. 查看控制台debug日志,确认认证流程中是否正确识别会话中的认证信息。
  3. 验证CustomUserDetailService实现是否正确,确保用户信息可被正常读取。

内容的提问来源于stack exchange,提问作者Vivek Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:47:20