【问题标题】:Encrypt Database password in application.yml for Micronaut + Hibernate为 Micronaut + Hibernate 加密 application.yml 中的数据库密码
【发布时间】:2021-03-25 08:36:19
【问题描述】:

对于 Micronaut + Hibernate 应用程序,我的数据库密码存储在 application.yml 中。

我正在寻找方法:在 yml 文件中提供加密密码并在构造数据库对象时对其进行解密。

Micronaut 没有提供实现这一点的方法。

但我认为使用 Hikari Connection pool 应该可以帮助我实现它。因为,Hikari CP 允许我拦截数据库对象的构建过程。至少有文件声称是这样。

有人遇到过这个问题并解决了吗?有没有其他方法可以在有(或)没有 Hikari 的情况下解决这个问题?

请多多指教。

【问题讨论】:

    标签: hibernate hikaricp micronaut


    【解决方案1】:

    我已经为 Micronaut + Hibernate + Tomcat CP 找到了实现它的方法

    注意: 应该也适用于 Hikari CP。只需更改 DatasourceConfiguration.class 的 packageName

    1. 在 application.yml 中提供加密密码

      数据源: 默认: 网址:${JDBC_URL:DB_URL} 驱动程序类名:${JDBC_DRIVER:DRIVER_CLASS} 用户名:${JDBC_USER:USER_NAME} 密码:${JDBC_PASSWORD:ENCRYPTED_PASSWORD}

    2)创建工厂类并替换类DatasourceConfiguration的方法“getPassword”
    import io.micronaut.configuration.jdbc.tomcat.DatasourceConfiguration;
    import io.micronaut.configuration.jdbc.tomcat.DatasourceFactory;
    import io.micronaut.context.ApplicationContext;
    import io.micronaut.context.annotation.Bean;
    import io.micronaut.context.annotation.Context;
    import io.micronaut.context.annotation.EachBean;
    import io.micronaut.context.annotation.Factory;
    import io.micronaut.context.annotation.Replaces;
    import io.micronaut.context.annotation.Requires;
    import io.micronaut.inject.qualifiers.Qualifiers;
    import org.apache.tomcat.jdbc.pool.PoolProperties;
    import javax.inject.Inject;
    import javax.inject.Singleton;
    import javax.sql.DataSource;
    
    
    @Factory
    public class ApplicationConfiguration {
    
      @Context
      @Replaces(value = String.class, bean = io.micronaut.configuration.jdbc.tomcat.DatasourceConfiguration.class, named = "default")
      public String getPassword() {
        DatasourceConfiguration configuration = applicationContext.getBean(DatasourceConfiguration.class,
            Qualifiers.byName("default"));
        configuration.setPassword(decryptPassword(configuration.getPassword()));
        return configuration.getPassword();
      }
    
    //BELOW IS ONE OTHER APPROACH TO ACHIEVE THIS...BUT METHOD ABOVE IS BEST
      @Singleton
      @Replaces(value = DataSource.class, factory = DatasourceFactory.class)
      @Context
      @EachBean(DatasourceConfiguration.class)
      public DataSource dataSource(DatasourceConfiguration datasourceConfiguration) {
        org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(datasourceConfiguration);
        
        ds.getPoolProperties().setPassword(decryptPassword(configuration.getPassword()));
        return ds;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-24
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2014-04-09
      相关资源
      最近更新 更多