按照此处的主题指南并在此处基于Baeldung的示例添加BCrypt密码编码器,我已将Spring Boot应用程序配置为使用数据库(单独设置,而不是由ORM自动生成)来作为身份验证用户详细信息的来源。我的安全配置(此处)的这一部分如下所示:
@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创建 它,如果已经存在 ,请跳过它。
原因: 必须能够登录到应用程序的新初始化副本,有时需要重新启动几次,才能在开发人员的计算机上进行测试和实验。我的“生产”数据库应该已经具有“管理员”登录名,并且该应用程序不应覆盖它,否则将无法崩溃。
因此,我的问题是: 如何jdbcAuthentication以一种这样的方式初始化Spring Boot 配置中的默认用户:如果用户名已经存在,Spring Boot不会崩溃?
jdbcAuthentication
或者 :如果可以INSERT在数据库启动时使用SQL 来使用默认用户进入数据库,则不需要在Spring Boot配置中进行操作。但是我不知道如何以INSERT与Spring Boot的哈希匹配的方式在语句中哈希密码。
INSERT
您可以将选项.withDefaultSchema()与您正在使用的jdbcauthentication一起使用,来使用您想过的替代解决方案。如您所提到的那样,您可能必须找出在该脚本中使用哈希密码的方法。
.withDefaultSchema()
如果您有任何后续问题,这篇baeldung博客文章将为您提供帮助。
https://www.baeldung.com/spring-security-jdbc- authentication
希望这可以帮助。