Spring 在Tomcat的JNDI数据源中避免明文密码
我使用的是在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
<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的区别和前景吗?