带有用户名和密码的 Zonky + Spring Boot + Postgres + Flyway

Posted

技术标签:

【中文标题】带有用户名和密码的 Zonky + Spring Boot + Postgres + Flyway【英文标题】:Zonky + Spring Boot + Postgres + Flyway with Username and Password 【发布时间】:2019-11-22 09:48:01 【问题描述】:

我们正在使用 Zonky 对由 Postgres 和 Flyway 支持的 Spring Boot 应用程序进行集成测试。一切都像魅力一样。 然而,由于我们有特定的数据库配置,应用程序用户没有 DDL 权限。所以对于数据库迁移,我们有一个不同的数据库用户(具有 DDL 权限),我们通过spring.flyway.user 设置。不幸的是,为 flyway 设置用户名会强制 FlywayAutoConfiguration 专门为 Flyway 创建一个内联数据源。这是一个问题,因为 Zonky 在启动 Postgres 实例后,会使用具有正确 url/user/pass 的 bean 覆盖原始数据源 bean。因此 Flyway 尝试连接不存在的数据库并以Connection Refused 失败。 (参见存储库中的issue)

【问题讨论】:

【参考方案1】:

由于使用专用凭据为 Flyway 创建的数据源不是 bean,Zonky 对此无能为力。 一种解决方案是为 Flyway 创建一个数据源 bean,并使用 @FlywayDataSource 对其进行注释。但这意味着您还必须创建主数据源并将其设为@Primary。 在我们的例子中,我们使用了 Spring Boot 创建的数据源 bean,所以我们没有走上面的解决方案。相反,我们在集成测试中添加了以下内容:

public class SpringFlywayCredentialsInitializer
        implements ApplicationContextInitializer<ConfigurableApplicationContext> 

    @Override
    public void initialize(ConfigurableApplicationContext c) 
        for (PropertySource<?> s : c.getEnvironment().getPropertySources()) 
            if (s.containsProperty("spring.flyway.user") 
                    && s instanceof MapPropertySource) 
                ((MapPropertySource) s).getSource().remove("spring.flyway.user");
            
        
    

【讨论】:

以上是关于带有用户名和密码的 Zonky + Spring Boot + Postgres + Flyway的主要内容,如果未能解决你的问题,请参考以下文章

带有休眠和散列密码的 Spring Security DB 身份验证?

Flyway 7.5.1 及更高版本无法初始化 Zonky-test DB

返回用户名和密码以登录表单grails spring security

如何使用带有 LDAP 的 Spring Security 获取用户信息

Spring Boot / Spring Security中的错误401未经授权

Spring安全缓存基本身份验证?不验证后续请求