java - 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中的自动配置来解密密码?
解决方案
你有很多可用的选项。下面只是两个。
如果您有权访问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)
将被代理。
推荐阅读
- visual-c++ - RegGetValue 返回类型 REG_NONE
- spring - 有哪些具体案例可以证明 Spring 选择优于 Spring Boot 是合理的?
- python - 在 python 中创建具有分布作为插图的图形的最佳方法是什么?
- python - 向数据库发送信息时出错
- c# - StackExchange Redis 中的 KeysAsync 方法在哪里
- ios - 如何从其句柄(macOS / iOS)中获取库的路径?
- pandas - 在两列之间查找最早和最晚的日期
- python-3.x - 如何修复python sqlite数据库不存储数据
- javascript - Uncaught DOMException (in promise) - 在 serviceworker 中劫持特定的 GraphQL 请求
- swift - Auth0 不会使用 swift 退出