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

Why authentication provider when implementing basic auth? Spring Security

现在,我正在尝试学习使用 Spring 安全性的基本身份验证 + 数据库。 我已经完成了 UserDetails 和 UserDetailsS​​ervice 的实现(这里我从数据库中获取用户)并使用装饰器模式来使用我自己的“用户”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;
    }

是否有任何特定的充分理由这样做,或者 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);

所以你的评论很有道理。即通过定义 userDetailsServicepasswordEncoder bean,它们被 spring 安全和 autowired

检测到