【问题标题】:Why authentication provider when implementing basic auth? Spring Security为什么在实现基本身份验证时需要身份验证提供程序?春季安全
【发布时间】:2020-10-20 12:21:28
【问题描述】:

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

现在,我在不同论坛和平台上的许多示例中注意到的是,当开发人员在春季实现基本的 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 Security 中是否有任何新功能已经涵盖了“幕后”的这种实现。 正如我所说,我的应用程序可以在没有这种实现的情况下正常工作。 这就是为什么我要问是否有人有一个好的解释。

【问题讨论】:

  • 您也可以使用auth.userDetailsService,这将产生相同的结果
  • 是的,我在尝试使用 authenticationProvider 后也这样做了。但问题是它也可以在没有它的情况下工作。那我为什么要使用它呢?
  • 您有某种身份验证提供程序,如果您忽略它,它将仅使用默认用户的默认内存中的提供程序。它不会使用您的数据库。
  • 然后您禁用了 Spring Boot 自动配置(通过添加 @EnableWebSecurity)并将 UserDetailsService 添加为 bean(手动或通过组件扫描)。我相信新版本的 Spring Security 会检测到单个 UserDetailsService 并自动使用它,旧版本没有。
  • 它将检测解码器,否则使用委派的解码器。在基于 Java 的配置中添加了对单个 bean 的检测,以使事情变得更容易。

标签: spring database spring-boot spring-security basic-authentication


【解决方案1】:

看着InitializeUserDetailsBeanManagerConfigurer.java

它具有以下 sn-p 并连接它们:

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);

所以你的 cmets 是有道理的。即通过定义userDetailsServicepasswordEncoder bean,它们会被spring security 和autowired 检测到

【讨论】:

  • 是的。检查了它。如果已经有 bean/组件,它会默认将 userDetailsS​​ervice 与 PasswordEncoder 一起设置。谢谢。
  • 根据变更日志,这可以从 Spring Security 4.1.0 开始完成。所以它并不是那么新,在此之前您需要更详细的版本。见github.com/spring-projects/spring-security/issues/3088
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 2021-10-10
  • 2017-12-25
  • 2011-02-25
  • 2022-07-22
  • 2015-08-08
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多