【问题标题】:Spring boot with flyway - use a dynamic db password带有 flyway 的 Spring Boot - 使用动态数据库密码
【发布时间】:2020-01-20 11:46:23
【问题描述】:

我想将flyway集成到我的spring boot项目中,但是我无法在属性文件中将密码写入数据库。

对于我的普通数据源,我使用以下代码

@Configuration
@Slf4j
public class SwatDataBaseConfig {

    @Value("${swat.decrypt.location}")
    private String fileLocation;

    @Value("${swat.datasource.url}")
    private String dbURL;

    @Value("${swat.datasource.driver-class-name}")
    private String driverName;

    @Value("${swat.datasource.username}")
    private String userName;

    @Value("${swat.datasource.password}")
    private String hashedPassword;

    @Bean
    public DataSource primaryDataSource() {
        // String password = encryptor.decrypt(hashedPassword);
        // log.debug("password is: " + password);
        String password = null;;
        Process process = null;
        try {
            process = new ProcessBuilder(fileLocation, hashedPassword).start();
        } catch (IOException e) {
            log.error("Could not read the file", e);
            return null;
        }
        InputStream is = process.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        try {
            while ((line = br.readLine()) != null) {
                password = line;
                try {
                    password = line.split(" ")[1].trim();
                }catch(Exception ex) {
                    log.error("Error while sanitating the password", ex);
                }
            }
        } catch (IOException e) {
            log.error("Could not process the file output", e);
        }
        PoolProperties poolProperties = new PoolProperties();
        poolProperties.setUrl(dbURL);         
        poolProperties.setUsername(userName);            
        poolProperties.setPassword(password);
        poolProperties.setDriverClassName(driverName);
        poolProperties.setTestOnBorrow(true);
        poolProperties.setValidationQuery("SELECT 1");
        poolProperties.setValidationInterval(0);
        DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
        process.destroy();
        return ds;
       // return DataSourceBuilder.create().url(dbURL).driverClassName(driverName).username(userName).password(password).build();
    }

这会从属性中获取我的加密密码,对其进行解密,然后将其传递给数据库, 在我见过的所有 flyway 示例中,密码都以纯文本形式写入 flyway 属性文件中

如何按照我使用主数据源的方式配置它

【问题讨论】:

    标签: spring-boot flyway


    【解决方案1】:

    在这种情况下,您可以使用环境变量来定义您的密码。 为此,您可以将属性设置为:

    swat.datasource.password=${SWAT_PASSWORD}
    

    当您部署或运行​​您的应用程序时,您只需在您的环境中设置 SWAT_PASSWORD 变量。

    您也可以使用默认值,如果未设置变量,系统将使用它

    swat.datasource.password=${SWAT_PASSWORD:default_password}
    

    【讨论】:

    • 感谢您的建议,但它增加了复杂性,我们为每个客户单独安装,我希望它在代码上完成
    【解决方案2】:

    您可以通过将自己的数据源和配置添加到 Flyway 来覆盖 Flyway Bean,您可以在其中传递自己的解密密码。您现在必须在此 Bean 中手动配置 Flyway,因为自动配置将不再起作用才能使用其他 Flyway 属性。

    @Configuration
    public class FlywayConfiguration {
    
        @Value("${spring.flyway.url}")
        private String flywayUrl;
    
        @Value("${spring.flyway.user}")
        private String flywayUser;
    
        @Value("${spring.flyway.password}")
        private String flywayPassword;
    
        // can still use spring.flyway.enabled
        @ConditionalOnProperty(prefix = "spring.flyway", name = "enabled", matchIfMissing = true)
        @ConfigurationProperties(prefix = "spring.flyway")
        @Bean(initMethod = "migrate")
        public Flyway flyway() {
    
            DataSource dataSource = new DataSource();
    
            try {
                PoolProperties prop = new PoolProperties();
                prop.setUrl(flywayUrl);
                prop.setUsername(flywayUser);
                prop.setPassword(flywayPassword); // Add custom code to decrypt password
                dataSource = new DataSource(prop);
            } catch (Exception e) {
                log.error(e);
                log.error(e.getMessage());
            }
    
            // Configure Flyway with other properties if necessary
            return Flyway.configure().dataSource(dataSource).load();
        }
    }
    

    有关 Flyway Java API 的更多信息:

    【讨论】:

      猜你喜欢
      • 2019-11-22
      • 1970-01-01
      • 2021-07-19
      • 2019-02-02
      • 2019-11-04
      • 2020-10-17
      • 2020-07-06
      • 2017-02-20
      • 2015-06-20
      相关资源
      最近更新 更多