Spring Security报错"No default password encoder configured"的解决方案咨询
嘿,我看到你碰到了Spring Security里的「No default password encoder configured」这个头疼的报错,结合你贴出来的这段不完整的SecurityConfig代码,我来帮你捋清楚怎么解决这个问题~
首先,这个错误本质上是Spring Security的认证组件找不到可用的密码编码器,虽然你已经定义了PasswordEncoder的Bean,但大概率是配置环节没把它正确关联到认证流程里。咱们一步步来修复:
第一步:确认你的PasswordEncoder Bean配置正确
你当前的写法是完全没问题的,Spring官方也推荐用DelegatingPasswordEncoder,它能自动识别密码前缀(比如{bcrypt})来匹配对应的加密算法:@Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); }第二步:补全并修正AuthenticationManager的配置
你贴的代码里AuthenticationManager的定义写到一半断了,这里必须把PasswordEncoder明确设置给DaoAuthenticationProvider,同时补全UserDetailsService的注入:@Bean public AuthenticationManager authenticationManager(UserDetailsService userDetailsService, PasswordEncoder passwordEncoder) throws Exception { DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); // 补全UserDetailsService的注入 provider.setUserDetailsService(userDetailsService); // 关键:把我们定义的密码编码器绑定到认证提供者 provider.setPasswordEncoder(passwordEncoder); // 用ProviderManager来包装这个提供者,作为AuthenticationManager的实现 return new ProviderManager(Collections.singletonList(provider)); }之前的代码就是缺了
provider.setPasswordEncoder(passwordEncoder)这一步,导致认证组件不知道要用你定义的编码器。第三步:确保SecurityFilterChain也关联到正确的认证配置
如果你是用SecurityFilterChain来配置HTTP安全规则,记得把上面的AuthenticationManager关联进去,或者直接在链里指定UserDetailsService和PasswordEncoder:@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) .formLogin(form -> form.permitAll()) // 关联我们自定义的AuthenticationManager .authenticationManager(authenticationManager(userDetailsService(), passwordEncoder())); return http.build(); }或者更简洁的方式,直接在HttpSecurity里设置:
@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) .formLogin(form -> form.permitAll()) .userDetailsService(userDetailsService()) .passwordEncoder(passwordEncoder()); return http.build(); }
按照上面的步骤调整后,Spring Security就能正确找到你配置的密码编码器,那个报错应该就会消失啦。
备注:内容来源于stack exchange,提问作者Shin Thant Maung

