JBoss多Oracle数据源密码加密配置问题咨询
既然你已经搞定了单数据源的密码加密,多Oracle数据源的配置其实就是单数据源逻辑的扩展——核心是让每个数据源对应正确的解密策略,下面给你分步讲清楚具体操作:
1. 先准备好每个数据源的加密密码
用JBoss自带的加密工具(比如对应版本的PBEUtils工具类,或者命令行加密脚本)生成每个数据库账号对应的加密密码。如果安全要求不高,所有数据源可以共用同一个加密密钥;如果需要更细粒度的安全控制,也可以为每个数据源单独生成密钥。
2. 在login-config.xml中配置加密策略
单数据源时你加了一组<application-policy>,多数据源的话有两种配置方式:
方式一:为每个数据源单独配置策略(推荐,清晰易维护)
为每个数据源新增独立的加密策略,每个策略对应一个数据库的账号和加密密码:
<!-- 数据源1的加密策略 --> <application-policy name="OracleDS1"> <authentication> <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required"> <module-option name="username">db_user1</module-option> <module-option name="password">ENCRYPTED_PWD_FOR_DS1</module-option> <module-option name="managedConnectionFactoryName">jboss.jca:service=ManagedConnectionFactory,name=OracleDS1</module-option> </login-module> </authentication> </application-policy> <!-- 数据源2的加密策略 --> <application-policy name="OracleDS2"> <authentication> <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required"> <module-option name="username">db_user2</module-option> <module-option name="password">ENCRYPTED_PWD_FOR_DS2</module-option> <module-option name="managedConnectionFactoryName">jboss.jca:service=ManagedConnectionFactory,name=OracleDS2</module-option> </login-module> </authentication> </application-policy> <!-- 剩下3个数据源依葫芦画瓢就行 -->
划重点:每个
application-policy的name要和后续数据源配置里的security-domain对应,managedConnectionFactoryName要匹配数据源的JNDI标识,别写错了!
方式二:复用通用加密策略(适合所有数据源加密规则一致的场景)
如果所有数据源用的是同一套加密算法和密钥,可以只配置一个通用策略,减少重复代码:
<application-policy name="OracleGlobalSecureDS"> <authentication> <login-module code="org.jboss.resource.security.SecureIdentityLoginModule" flag="required"> <!-- 这里不硬编码账号密码,由数据源自己传入 --> <module-option name="managedConnectionFactoryName">jboss.jca:service=ManagedConnectionFactory,name=*</module-option> </login-module> </authentication> </application-policy>
3. 配置每个oracle-ds.xml中的数据源
不管用哪种策略方式,都要在数据源配置里移除明文的user-name和password(或者按复用策略的方式调整),并关联对应的加密策略:
对应方式一的数据源配置
每个数据源的security-domain指向自己专属的加密策略名称:
<!-- 数据源1配置 --> <local-tx-datasource> <jndi-name>OracleDS1</jndi-name> <connection-url>jdbc:oracle:thin:@//dbhost1:1521/dbname1</connection-url> <driver-class>oracle.jdbc.OracleDriver</driver-class> <!-- 删掉原来的明文user-name和password --> <security-domain>OracleDS1</security-domain> <!-- 和login-config里的策略名对应 --> <!-- 其他常规配置(比如连接池参数)保留 --> </local-tx-datasource> <!-- 数据源2配置 --> <local-tx-datasource> <jndi-name>OracleDS2</jndi-name> <connection-url>jdbc:oracle:thin:@//dbhost2:1521/dbname2</connection-url> <driver-class>oracle.jdbc.OracleDriver</driver-class> <security-domain>OracleDS2</security-domain> <!-- 其他配置 --> </local-tx-datasource>
对应方式二的数据源配置
这种方式下,你可以在数据源里保留user-name,并用encrypted-password代替明文password,然后统一指向通用策略:
<local-tx-datasource> <jndi-name>OracleDS1</jndi-name> <connection-url>jdbc:oracle:thin:@//dbhost1:1521/dbname1</connection-url> <driver-class>oracle.jdbc.OracleDriver</driver-class> <user-name>db_user1</user-name> <encrypted-password>ENCRYPTED_PWD_FOR_DS1</encrypted-password> <!-- 加密后的密码 --> <security-domain>OracleGlobalSecureDS</security-domain> <!-- 通用策略名 --> </local-tx-datasource>
4. 验证配置是否生效
重启JBoss后,先看服务器日志有没有数据源连接失败的报错,再通过应用功能测试每个数据源是否能正常读写数据。如果遇到解密失败的问题,优先检查这几点:
- 加密密码是否用正确的密钥生成
managedConnectionFactoryName是否和数据源的JNDI名称完全匹配security-domain的名称是否和login-config.xml里的策略名一致
内容的提问来源于stack exchange,提问作者DD.

