【发布时间】:2020-10-20 12:21:28
【问题描述】:
现在,我正在尝试使用 Spring 安全性学习基本身份验证 + 数据库。 我已经完成了 UserDetails 和 UserDetailsService 的实现(这里我从数据库中获取用户)并使用装饰器模式来使用我自己的“用户”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