Spring 在Tomcat的JNDI数据源中避免明文密码

Spring 在Tomcat的JNDI数据源中避免明文密码,spring,tomcat,datasource,jndi,hikaricp,Spring,Tomcat,Datasource,Jndi,Hikaricp,我使用的是在tomcat服务器中配置的JNDI数据源。我希望避免将密码存储为明文,而且我在应用程序中有一个现有的加密逻辑,用于加密数据库密码 <Resource name="jdbc/testdb" auth="Container" factory="com.zaxxer.hikari.HikariJNDIFactory" type="javax.sql.DataSource" minimumIdle="5" maximumPoolSize

我使用的是在tomcat服务器中配置的JNDI数据源。我希望避免将密码存储为明文,而且我在应用程序中有一个现有的加密逻辑,用于加密数据库密码

<Resource name="jdbc/testdb" auth="Container"
      factory="com.zaxxer.hikari.HikariJNDIFactory"
      type="javax.sql.DataSource"
      minimumIdle="5" 
      maximumPoolSize="50"
      connectionTimeout="300000"
      driverClassName="org.mariadb.jdbc.Driver"
      jdbcUrl="jdbc:mysql://localhost:3307/testdb"
      dataSource.implicitCachingEnabled="true" 
      connectionTestQuery="Select 1" />

考虑到这个用例和在线可用的可能解决方案,我决定使用org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter为使用代码的数据库提供用户名和密码

<bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="java:comp/env/jdbc/testdb" />
    </bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter">
   <property name="targetDataSource" ref="dataSource1"/>
   <property name="username" value="${dataSource.username}"/>
   <property name="password" value="#{passwordDecryptor.decryptedString}"/>
 </bean>

这种方法对我来说适用于连接MSSQL数据库,但在MariaDB上非常奇怪地失败,错误为“拒绝用户访问@'localhost'(使用密码:否)”。我想知道这个问题是否与HikariCP连接池有关,因为C3P0实现也可以这样做,没有任何问题


另外,我想知道这是否是正确的方法,请建议是否可以改进这一方法以获得更好的性能。

好的,我看了一下,试一试:


有什么不同?我们没有使用
com.zaxxer.hikari.HikariJNDIFactory
。为什么?因为
HikariJNDIFactory
使用
HikariDataSource(HikariConfig config)
构造函数,它会立即实例化底层数据源,之后就不能再更改配置

使用
BeanFactory
,我们调用默认构造函数,它在第一次调用
getConnection()
之前不会实例化底层数据源,这意味着我们可以在JNDI查找之后自由设置用户名/密码

在弹簧侧:


${dataSource.username}
${passwordDecryptor.decryptedString}

我相信这应该是可行的,或者是非常接近的。我还将向HikariCP添加一项内容,以表彰JNDI环境的通过,从而使
可以在
标签中使用,以获得更清洁的解决方案。

接下来的
UserCredentialsDataSourceAdapter
将不会与HikariCP一起使用(目前不适用于Tomcat DBCP、Vibur和其他几个池)。这是因为
UserCredentialsDataSourceAdapter
使用
getConnection(用户名、密码)
形式的
getConnection()
,HikariCP已经不赞成这种方法,并且正如前面提到的,其他池已经取消了支持。我对您的问题没有一个好的答案,即使是作为HikariCP的开发人员,但我将研究如何最好地完成它。感谢Brett,我急需一个解决方案……请建议一个解决方案或替代方案,以帮助我的usecaseT谢谢你的回答Brett,你能解释一下使用HikariJNDIFactory和HikariDataSource的区别和前景吗?