无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
相关产品推荐
相关产品推荐

