一尘不染

如何使用默认用户名/密码初始化Spring Boot安全配置,但在第二次运行时不会崩溃?

spring-boot

按照此处主题指南在此处基于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不会崩溃?

或者 :如果可以INSERT在数据库启动时使用SQL 来使用默认用户进入数据库,则不需要在Spring
Boot配置中进行操作。但是我不知道如何以INSERT与Spring Boot的哈希匹配的方式在语句中哈希密码。


阅读 401

收藏
2020-05-30

共1个答案

一尘不染

您可以将选项.withDefaultSchema()与您正在使用的jdbcauthentication一起使用,来使用您想过的替代解决方案。如您所提到的那样,您可能必须找出在该脚本中使用哈希密码的方法。

如果您有任何后续问题,这篇baeldung博客文章将为您提供帮助。

https://www.baeldung.com/spring-security-jdbc-
authentication

希望这可以帮助。

2020-05-30