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

使用InMemoryUserDetailsManager时遭遇Bad Credentials Error问题求助

Spring Security 自定义内存用户登录报Bad Credentials,默认用户正常的排查解决

问题描述

我是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:52:36