使用InMemoryUserDetailsManager时遭遇Bad Credentials Error问题求助
问题描述
我是Spring新手,跟着Dan Vega的Spring Security JWT教程学习,目前遇到一个问题:用自定义的凭据在localhost登录时,一直收到Bad Credentials错误,但使用Spring自动生成的user账号和对应的密码却能正常登录。我尝试了两种InMemoryUserDetailsManager的配置方式,都没能解决问题。
初始配置代码:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http .csrf(csrf -> csrf.disable()) .authorizeRequests( auth -> auth .anyRequest().authenticated() ) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .httpBasic(Customizer.withDefaults()) .build(); } @Bean public InMemoryUserDetailsManager users() { return new InMemoryUserDetailsManager( User.withUsername("myname") .password("{noop}password") .authorities("read") .build() ); } }
重构后的配置代码:
@Bean public UserDetailsService users() { UserDetails user = User.builder() .username("admin") .password("{noop}password") .roles("ADMIN") .build(); return new InMemoryUserDetailsManager(user); }
排查解决步骤
1. 确认配置类被Spring正确扫描
检查SecurityConfig类所在的包路径,确保它在Spring Boot主应用类(带@SpringBootApplication注解的类)的包或子包下。如果不在,Spring不会加载这个配置类,自然会使用默认的用户生成逻辑。
2. 检查密码编码器配置
虽然你在密码前加了{noop}前缀(表示不加密),但如果项目中存在其他PasswordEncoder类型的Bean,会覆盖Spring Security的默认配置,导致{noop}前缀不生效。
解决方法:在SecurityConfig中显式配置适配{noop}的密码编码器(仅用于测试环境,生产环境禁用明文密码):
@Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); }
或者更推荐使用DelegatingPasswordEncoder(兼容多种编码格式):
@Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); }
该编码器会自动识别{noop}前缀,正确处理明文密码。
3. 验证自定义UserDetailsService Bean是否被加载
可以在users()方法中添加日志输出,或者启动应用时查看Spring容器的Bean列表,确认自定义的UserDetailsService或InMemoryUserDetailsManager已经被注册。如果没有被注册,说明配置类未生效,回到第一步检查包扫描范围。
4. 重启应用,避免热部署缓存
部分热部署工具(比如Spring DevTools)可能无法正确更新配置,导致修改后的代码未生效。完全重启应用后,再测试自定义凭据登录。
5. 检查请求的认证信息
确保请求使用HTTP Basic认证,用户名和密码无拼写错误(注意大小写)。比如用Postman测试时,在Authorization选项卡选择Basic Auth,输入正确的用户名(myname/admin)和密码(password)。
内容的提问来源于stack exchange,提问作者MintedFairy

