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

无JWT的Spring Security认证问题:Postman调用失败排查

问题分析与解决方案

核心冲突点

CommandLineRunner内操作成功是因为直接在程序内部通过SecurityContextHolder注入了认证信息,绕过了HTTP层面的拦截逻辑。而Postman请求失败的根源是无状态会话配置与表单认证不兼容:你设置了sessionCreationPolicy(STATELESS),但表单认证是基于Session来保存用户认证状态的,无状态模式下Spring Security不会创建或维护Session,导致认证成功后后续请求仍被判定为未认证,要么触发登录页重定向循环,要么返回403。


修复方案一:适配表单认证(基于Session)

1. 调整会话策略

将无状态会话改为IF_REQUIRED(Spring Security默认策略,仅在需要时创建Session),匹配表单认证的依赖:

.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED))

2. 修正完整配置

移除不必要的loginPage配置(如果没有前端登录页面),避免重定向循环:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(auth -> auth
                    .requestMatchers("/api/v1/users/auth/**").permitAll()
                    .requestMatchers("/api/v1/home/players/create").hasAuthority(SPECTATOR)
                    .anyRequest().authenticated())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED))
            .authenticationProvider(authProvider)
            .formLogin(form -> form
                    .loginProcessingUrl("/api/v1/users/auth/login")
                    .defaultSuccessUrl("/homepage", true)
                    .failureUrl("/login?error=true"));

    return http.build();
}

3. Postman请求步骤

  • 先发送POST请求到/api/v1/users/auth/login,参数用表单格式(username、password),登录成功后会返回Set-Cookie头;
  • 后续调用/api/v1/home/players/create时,Postman会自动携带Session Cookie,无需手动配置。

修复方案二:无状态HTTP Basic认证(适合纯API服务)

如果你的服务是纯后端API,不需要前端页面,推荐用HTTP Basic认证适配无状态模式:

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(auth -> auth
                    .requestMatchers("/api/v1/users/auth/**").permitAll()
                    .requestMatchers("/api/v1/home/players/create").hasAuthority(SPECTATOR)
                    .anyRequest().authenticated())
            .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authenticationProvider(authProvider)
            .httpBasic(Customizer.withDefaults());

    return http.build();
}

Postman请求时,在Authorization选项卡选择Basic Auth,输入用户名密码即可完成认证。


额外检查项

  • 确认AuthenticationProvider正确读取并返回用户的SPECTATOR权限;
  • 检查用户注册时,角色是否被正确持久化到数据库,避免认证时权限缺失。

内容的提问来源于stack exchange,提问作者saba morchilashvili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:40:22