现在,我正在尝试使用Spring安全性学习基本的身份验证+数据库。 我已经完成了UserDetails和UserDetailsService的实现(这里我从数据库中获取用户(,并使用装饰器模式来使用我自己的"User"Bean。一切都按照应有的方式工作。
现在,我在不同的论坛,平台的许多示例中注意到的是,当开发人员在春季实现基本身份验证+ db时,他们使用AuthenticationProvider,这让我感到困惑! 我所看到的一个简单的例子:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(provider());
}
@Bean
DaoAuthenticationProvider provider() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setPasswordEncoder(getPasswordEncoder());
provider.setUserDetailsService(userService);
return provider;
}
是否有任何特定的充分理由这样做,或者 Spring 安全中是否有任何新功能已经涵盖了这种"幕后"实现。 正如我所说,我的应用程序在没有这种实现的情况下可以正常工作。 这就是为什么我问是否有人有一个很好的解释。
看着InitializeUserDetailsBeanManagerConfigurer.java
,
它具有以下代码片段并连接它们:
UserDetailsService userDetailsService = getBeanOrNull(UserDetailsService.class);
...
PasswordEncoder passwordEncoder = getBeanOrNull(PasswordEncoder.class);
....
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(userDetailsService);
if (passwordEncoder != null) {
provider.setPasswordEncoder(passwordEncoder);
}
...
auth.authenticationProvider(provider);
所以你的评论是有道理的。即通过定义userDetailsService
和passwordEncoder
豆,它们被弹簧安全和autowired
检测到