是否可以从UserDetailsService bean中获取PasswordEncoder bean?

后端开发 2026-07-08

大多数Spring Boot应用的开发者都知道它,并在他们的 WebSecurityConfigurerAdapter 扩展中使用它:

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
  auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}

但是否有人研究过,在上述设置方式之后,从 userDetailsService 获取默认的 passwordEncoder bean的可能性?

如果在 userDetailService 需要 passwordEncoder bean,似乎就没有必要把该bean注入到 userDetailService,因为它已经通过 WebSecurityConfigurerAdapter 实例被设置在其中了。

解决方案

也许这一行会让你对fluent API产生了误导性的印象:

auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());

这并不意味着 PasswordEncoder 会被添加到 UserDetailsService。这两个方法都是在同一个 AuthenticationManagerBuilder 上调用的。auth.userDetailsService 调用返回的是 DaoAuthenticationConfigurer,而不是 UserDetailsService 实例。

从概念上讲,它更接近于:

builder.setUserDetailsService(userDetailsService);
builder.setPasswordEncoder(passwordEncoder);

因此,如果你的 UserDetailsService 需要一个 PasswordEncoder,你必须注入它,如下所示:

@Service
public class MyUserDetailsService implements UserDetailsService {

    private final PasswordEncoder passwordEncoder;

    public MyUserDetailsService(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章