是否可以从UserDetailsService bean中获取PasswordEncoder bean?
大多数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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。