Spring 为什么在实现基本身份验证时使用身份验证提供程序?春季安全
现在,我正在尝试学习使用SpringSecurity的基本身份验证+数据库。 我已经完成了UserDetails和UserDetailsService的实现(这里我从db中获取用户),并使用decorator模式来使用我自己的“用户”Bean。一切都按它应该的方式运作 现在,我在不同论坛和平台上的许多示例中注意到,当开发人员在spring中实现基本auth+db时,他们使用AuthenticationProvider,这让我感到困惑! 我所看到的一个简单例子:Spring 为什么在实现基本身份验证时使用身份验证提供程序?春季安全,spring,database,spring-boot,spring-security,basic-authentication,Spring,Database,Spring Boot,Spring Security,Basic Authentication,现在,我正在尝试学习使用SpringSecurity的基本身份验证+数据库。 我已经完成了UserDetails和UserDetailsService的实现(这里我从db中获取用户),并使用decorator模式来使用我自己的“用户”Bean。一切都按它应该的方式运作 现在,我在不同论坛和平台上的许多示例中注意到,当开发人员在spring中实现基本auth+db时,他们使用AuthenticationProvider,这让我感到困惑! 我所看到的一个简单例子: @Override p
@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;
}
是否有任何明确的理由这样做,或者SpringSecurity中是否有任何新功能已经“在幕后”涵盖了这种实现。
正如我所说,我的应用程序在没有这种实现的情况下可以正常工作。
这就是为什么我要问是否有人有一个好的解释。查看
initializeUserDetailsBeanManagerConfigure.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
bean,spring security和autowired
可以检测到它们,您也可以使用auth.userDetailsService
,这将产生相同的结果,我在尝试authenticationProvider之后也这样做了。但问题是,如果没有它,它也可以工作。那么我为什么要使用它呢?你有某种身份验证提供程序,如果你不使用它,它将只使用默认的内存中的一个默认用户。它将不使用您的数据库。然后您禁用了Spring引导自动配置(通过添加@EnableWebSecurity
),并将UserDetailsService
添加为bean(手动或通过组件扫描)。我相信较新版本的Spring Security会检测单个UserDetailsService
并自动使用,而较旧版本则不会。它会检测解码器,否则会使用授权服务。在基于Java的配置过程中,在某些地方添加了对单个bean的检测,以使事情变得更简单。检查过了。默认情况下,如果已经存在bean/组件,它会将userDetailsService与PasswordEncoder一起设置。谢谢。根据变更日志,这可以从SpringSecurity4.1.0开始执行。所以它并不是那么新,在此之前,您需要更详细的版本。看见