在 application.yml 中为 Micronaut + Hibernate 加密数据库密码
Encrypt Database password in application.yml for Micronaut + Hibernate
对于 Micronaut + Hibernate 应用程序,我将数据库密码存储在 application.yml。
我正在寻找方法:在 yml 文件中提供加密密码并在构造数据库对象时解密它。
Micronaut 没有提供实现此目的的方法。
但我认为使用 Hikari 连接池应该可以帮助我实现它。因为,Hikari CP 允许我拦截数据库对象的构建过程。至少有文件声称是这样。
有人遇到过这个问题并解决了吗?有没有其他方法可以用(或)不用 Hikari 来解决这个问题?
请指教。
我找到了一种方法来实现 Micronaut + Hibernate + Tomcat CP
注意: 也应该适用于 Hikari CP。只需更改 DatasourceConfiguration.class
的 packageName
在application.yml中提供加密密码
</p>
<p>数据源:
默认:
url: ${JDBC_URL:<code>DB_URL
}
驱动程序类名:${JDBC_DRIVER:DRIVER_CLASS}
用户名:${JDBC_USER:USER_NAME}
密码:${JDBC_PASSWORD:ENCRYPTED_PASSWORD}
2) 创建工厂class & 替换class DatasourceConfiguration 的方法"getPassword"
<pre><code>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;
}
}
对于 Micronaut + Hibernate 应用程序,我将数据库密码存储在 application.yml。
我正在寻找方法:在 yml 文件中提供加密密码并在构造数据库对象时解密它。
Micronaut 没有提供实现此目的的方法。
但我认为使用 Hikari 连接池应该可以帮助我实现它。因为,Hikari CP 允许我拦截数据库对象的构建过程。至少有文件声称是这样。
有人遇到过这个问题并解决了吗?有没有其他方法可以用(或)不用 Hikari 来解决这个问题?
请指教。
我找到了一种方法来实现 Micronaut + Hibernate + Tomcat CP
注意: 也应该适用于 Hikari CP。只需更改 DatasourceConfiguration.class
的 packageName在application.yml中提供加密密码
</p> <p>数据源: 默认: url: ${JDBC_URL:<code>DB_URL
} 驱动程序类名:${JDBC_DRIVER:DRIVER_CLASS} 用户名:${JDBC_USER:USER_NAME} 密码:${JDBC_PASSWORD:ENCRYPTED_PASSWORD}
<pre><code>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;
}
}