WSO2 EI 6.6.0 Secure Vault数据源密码读取失败问题求助
问题描述
我们尝试用WSO2 Secure Vault存储数据库密码,在序列的<dblookup>组件中直接配置连接参数时,{wso2:vault-lookup('password')}能正常解析并获取密文值,但通过独立的<datasource>定义配置数据库连接,再用<dblookup>通过dsName引用该数据源时,无法读取到正确的密码。
相关代码片段如下:
正常工作的DBLookup配置(直接指定连接参数)
<insequence> <dblookup> <connection> <pool> <driver>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver> <url>myurl</url> <user>username</user> <password>{wso2:vault-lookup('password')}</password> </pool> </connection> </dblookup> </insequence>
无法读取密码的数据源+DBLookup配置
<!-- 数据源代码片段 --> <datasource> <name>DataSource2</name> <description>DB to get data</description> <jndiConfig useDataSourceFactory="false"> <name>DataSource2</name> </jndiConfig> <definition type="RDBMS"> <configuration> <driverClassName>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverClassName> <url>MyURL</url> <username>Username</username> <password>{wso2:vault-lookup('password')}</password> </configuration> </definition> </datasource> <!-- 引用数据源的DBLookup --> <dblookup> <connection> <pool> <dsName>DataSource2</dsName> </pool> </connection> </dblookup>
解决方法
原因说明
WSO2的数据源是在服务器启动阶段初始化的,此时序列中的表达式解析逻辑尚未生效,{wso2:vault-lookup('password')}会被当作明文密码直接传递给数据库驱动,而非解析为实际的密码值。而直接在<dblookup>的连接池配置中使用该表达式时,是在请求运行阶段执行,表达式会被正常解析。
具体步骤
加密数据库密码
使用WSO2提供的加密工具(ciphertool.sh/ciphertool.bat)对数据库密码进行加密。执行工具后,按照提示输入主密钥,最终会生成加密后的密码字符串。修改数据源配置
在<datasource>的<password>标签中替换为加密后的密码,并添加encrypted="true"属性,告诉WSO2该密码已加密,启动时会通过Secure Vault解密。
修正后的数据源配置示例:
<datasource> <name>DataSource2</name> <description>DB to get data</description> <jndiConfig useDataSourceFactory="false"> <name>DataSource2</name> </jndiConfig> <definition type="RDBMS"> <configuration> <driverClassName>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverClassName> <url>MyURL</url> <username>Username</username> <password encrypted="true">encrypted_password_here</password> </configuration> </definition> </datasource>
- 验证配置
重启WSO2服务器,检查数据源是否能正常初始化,再通过<dblookup>引用该数据源测试数据库连接是否正常。
内容的提问来源于stack exchange,提问作者Venkatesh Puvvada
相关产品推荐
相关产品推荐

