Spring 为什么在实现基本身份验证时使用身份验证提供程序?春季安全

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

现在,我正在尝试学习使用SpringSecurity的基本身份验证+数据库。 我已经完成了UserDetails和UserDetailsService的实现(这里我从db中获取用户),并使用decorator模式来使用我自己的“用户”Bean。一切都按它应该的方式运作

现在,我在不同论坛和平台上的许多示例中注意到,当开发人员在spring中实现基本auth+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;
    }

是否有任何明确的理由这样做,或者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开始执行。所以它并不是那么新,在此之前,您需要更详细的版本。看见