首页 > 解决方案 > Springboot解密JNDI tomcat密码

问题描述

我在 tomcat 中为 JNDI 进行了以下配置。我在 server.xml 中加密了我的密码

<Resource auth="Container" 
          driverClassName="oracle.jdbc.driver.OracleDriver" 
          global="jdbc/dbsource" 
          maxIdle="30" 
          maxTotal="1000" 
          maxWaitMillis="100000" 
          name="jdbc/dbsource" 
          password=<<unencrypted password>> 
          type="javax.sql.DataSource" 
          url=<<dburl>> 
          username="user" />

我正在运行一个 springboot 应用程序,并且我在 application.properties 中配置了 JNDI 名称,如下所示

spring.datasource.jndi-name=java:comp/env/jdbc/dbsource

我直接将 JDBCTemplate 自动装配到我的 Bean 类以连接到 Oracle db。

我想在 tomcat server.xml 中加密我的密码。如何覆盖spring boot中的自动配置来解密密码?

标签: javaspring-bootjnditomcat9

解决方案


你有很多可用的选项。下面只是两个。

如果您有权访问server.xml(假设这是 Tomcat)文件,您可以指定您自己的实现BasicDataSourceFactory- 所以这将是初始化数据源的工厂。在您的自定义实现中,您可以利用解密代码服务来处理加密密码。

如果您无权访问server.xml一种方法,那就是使用UserCredentialsDataSourceAdapter.

目标 JDBC 数据源的适配器,将指定的用户凭据应用于每个标准 getConnection() 调用,隐式调用目标上的 getConnection(username, password)。所有其他方法都简单地委托给目标 DataSource 的相应方法。

所以基本上这可能是你的流程:

1) 加载 JNDI 数据源

2) 将 JNDI 数据源转换为 Tomcat数据源,以便能够调用getUsername()getPassword()

3) 在UserCredentialsDataSourceAdapter中,在调用之前解密密码getConnection(username, password)- 所有其他数据源调用将委托给原始数据源,只有getConnection(username, password)将被代理。


推荐阅读