无WebSecurityConfigurerAdapter的Spring Security遇Postman 403错误求助
Spring Security 无WebSecurityConfigurerAdapter下403错误解决
你的代码核心问题是未配置认证机制——虽然定义了用户信息和密码编码器,但SecurityFilterChain里只设置了授权规则,Spring Security无法验证请求中的用户身份,因此返回403。
问题分析
- 你将会话策略设为
SessionCreationPolicy.STATELESS(无状态),但未配置对应的认证方式(如HTTP Basic),导致请求/secure时,系统无法识别用户身份。 - 授权规则要求
/secure需要ADMIN或USER角色,但没有途径让系统获取请求中的用户凭证进行验证。
修复方案
在securityFilterChain方法中添加HTTP Basic认证配置,让Spring Security支持通过请求头传递用户凭证进行身份验证:
修改后的SecurityConfig代码:
package com.example.securityspring.security; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.NoOpPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean protected SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http .csrf((csrf) -> csrf.disable()) .cors((cors) -> cors.disable()) // 添加HTTP Basic认证配置 .httpBasic(httpBasic -> httpBasic) .authorizeHttpRequests( authorizationManagerRequestMatchers -> authorizationManagerRequestMatchers .requestMatchers(HttpMethod.GET, "/", "/open").permitAll() .requestMatchers(HttpMethod.GET, "/secure").hasAnyRole("ADMIN", "USER") // 其他请求都需要认证 .anyRequest().authenticated() ) .sessionManagement(sessionManagement -> sessionManagement .sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .build(); } @Bean public PasswordEncoder encoder() { return NoOpPasswordEncoder.getInstance(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.builder() .username("user") .password("password") .roles("USER") .build(); // 可选:添加ADMIN用户用于测试 UserDetails admin = User.builder() .username("admin") .password("admin") .roles("ADMIN") .build(); return new InMemoryUserDetailsManager(user, admin); } }
Postman请求测试
访问/secure接口时,在Postman中按以下步骤配置:
- 选择GET方法,输入请求地址
- 切换到
Authorization标签页 - 类型选择
Basic Auth - 输入用户名
user和密码password(或admin/admin) - 发送请求,即可正常返回"secure url"
额外提示
NoOpPasswordEncoder仅适合测试环境,生产环境请使用BCryptPasswordEncoder等安全的密码编码器。- 添加
.anyRequest().authenticated()规则可确保未匹配的请求都需要认证,提升系统安全性。
内容的提问来源于stack exchange,提问作者Олег Денькович Java
相关产品推荐
相关产品推荐

