hibernate - 为 Micronaut + Hibernate 加密 application.yml 中的数据库密码
问题描述
对于 Micronaut + Hibernate 应用程序,我的数据库密码存储在 application.yml 中。
我正在寻找方法:在 yml 文件中提供加密密码并在构造数据库对象时对其进行解密。
Micronaut 没有提供实现这一目标的方法。
但我认为使用 Hikari Connection pool 应该可以帮助我实现它。因为,Hikari CP 允许我拦截数据库对象的构建过程。至少有文件声称如此。
有没有人遇到过这个问题并解决了?有没有其他方法可以在有(或)没有 Hikari 的情况下解决这个问题?
好心提醒。
解决方案
我找到了一种为 Micronaut + Hibernate + Tomcat CP 实现它的方法
注意: 应该也适用于 Hikari CP。只需更改 DatasourceConfiguration.class 的 packageName
在 application.yml 中提供加密密码
datasources: default: url: ${JDBC_URL:
DB_URL
} driverClassName: ${JDBC_DRIVER:DRIVER_CLASS} username: ${JDBC_USER:USER_NAME} password: ${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;
}
}
推荐阅读
- c# - 如何从 DLL 导出中覆盖静态方法
- android - Dagger 2 访问依赖模块中的命名依赖项
- python - Python:从需要登录的网络下载历史数据的 csv 文件
- android - kotlin:如果 EditText 启用了 setError,如何获取?
- objective-c - 在 iOS 中关闭自动亮度
- linux - linux上的软件架构,多线程或多进程
- c# - LocalReport 有时会在渲染时挂起
- javascript - 我的代码没有运行:每秒打印 1 到 1000 之间的随机数
- node.js - 通过 POST 请求反应上传多张照片
- html - CSS无效选择器不适用于反应形式