首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Micronaut + Hibernate在application.yml中加密数据库密码

Micronaut + Hibernate在application.yml中加密数据库密码
EN

Stack Overflow用户
提问于 2021-03-25 08:36:19
回答 1查看 508关注 0票数 0

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

我正在寻找方法:在yml文件中提供一个加密的密码&在构建数据库对象时解密它。

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

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

有没有人面临过这个问题,解决了吗?在没有Hikari的情况下,还有其他方法来解决这个问题吗?

敬请指教。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-08 11:01:47

我已经为Micronaut + Hibernate + Tomcat找到了一种方法来实现它。

注意:也应该为Hikari工作。只需改变packageName of DatasourceConfiguration.class

  1. 在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类的“DatasourceConfiguration”方法

代码语言:javascript
复制
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;
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66795768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档