继专题指南在这里并添加基于 BCrypt 的密码编码器Baeldung 的例子在这里我已将 Spring Boot 应用程序配置为使用我的数据库(单独设置,不是由 ORM 或其他东西自动生成)作为其身份验证的用户详细信息来源。我的安全配置的这一部分(here)看起来像这样:
@Override
public void configure(AuthenticationManagerBuilder builder) throws Exception {
builder .jdbcAuthentication()
.dataSource(dataSource)
.withUser(User.withUsername("admin").password(passwordEncoder().encode("pass")).roles("SUPER"));
logger.debug("Configured app to use JDBC authentication with default database.");
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
第一次运行时,这会起作用,创建一个名为“admin”的用户,并使用散列密码和数据库中的指定角色。 (这是一个物有所值的 PostgreSQL 数据库。)但是,如果我尝试再次运行该应用程序,它无法启动并崩溃,因为它尝试再次创建相同的用户并收到重复的主键错误。
我想要什么:我希望 Spring Boot 创建默认用户如果它还不存在,如果已经存在则跳过它。
Why:必须能够登录到新初始化的应用程序副本,有时需要重新启动几次,以便在开发人员的计算机上进行测试和实验。我的“生产”数据库应该已经有“管理员”登录名,并且应用程序不应该覆盖它,或者因为不能覆盖而崩溃。
因此,我的问题是:如何在 Spring Boot 中初始化默认用户jdbcAuthentication
如果用户名已经存在,Spring Boot 不会崩溃吗?
或者: 如果我能INSERT
当数据库启动时,默认用户使用 SQL 进入数据库,我不需要在 Spring Boot 配置中执行此操作。但我不知道如何对密码进行哈希处理INSERT
声明的方式与 Spring Boot 的哈希相匹配。
PS:我的新配置还有另一个问题,破坏了一些自动化测试类(请参阅另一个问题如果有兴趣)。
您可以使用您认为使用该选项的替代解决方案.withDefaultSchema()
与您正在使用的 jdbcauthentication 一起。正如您在该替代方案中提到的,您可能必须找出在该脚本中使用散列密码的方法。
如果您有任何后续问题,这篇 baeldung 博客文章将为您提供帮助。
https://www.baeldung.com/spring-security-jdbc-authentication
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)