WildFly 9.0.1启动前动态取数据库凭证,避免写入standalone.xml
方案一:通过YAJSW传递JVM系统属性
无需修改standalone.xml核心结构,调整占位符类型后通过启动参数直接传递凭证,避免配置文件被修改。
修改standalone.xml的数据源配置
将原环境变量占位符改为JVM系统属性占位符:<user-name>${db.user}</user-name> <password>${db.password}</password>调整启动脚本与YAJSW配置
保留从Azure KeyVault获取凭证的逻辑,启动YAJSW时直接将凭证作为JVM参数传递给WildFly::: 从Azure KeyVault获取数据库凭证 for /f "tokens=*" %%a in ('java -cp C://MyJar.jar AzureKeyVaultUtil db-user') do set DB_USER=%%a for /f "tokens=*" %%a in ('java -cp C://MyJar.jar AzureKeyVaultUtil db-password') do set DB_PASSWORD=%%a :: 启动YAJSW,将凭证作为系统属性传递给WildFly call java -jar wrapper.jar -c wrapper-wfly-app_Portal.conf -- -Ddb.user=%DB_USER% -Ddb.password=%DB_PASSWORD%也可在YAJSW配置文件
wrapper-wfly-app_Portal.conf中直接读取环境变量配置系统属性:wrapper.java.additional.1=-Ddb.user=${env.DB_USER} wrapper.java.additional.2=-Ddb.password=${env.DB_PASSWORD}此方式下WildFly仅在运行时读取JVM系统属性,不会修改standalone.xml文件。
方案二:使用WildFly安全域加载凭证
通过自定义安全域模块,让WildFly从Azure KeyVault动态获取凭证,完全避免配置文件中出现凭证相关内容。
编写自定义登录模块
实现WildFlyLoginModule接口,在login方法中调用Azure KeyVault工具类获取凭证,并将凭证存入登录上下文。配置WildFly安全域
在standalone.xml中添加自定义安全域配置:<security-domain name="AzureKeyVaultDS" cache-type="default"> <authentication> <login-module code="com.yourcompany.AzureKeyVaultLoginModule" flag="required"> <module-option name="keyVaultUrl" value="https://your-vault-name.vault.azure.net/"/> <module-option name="userSecretName" value="db-user"/> <module-option name="passwordSecretName" value="db-password"/> </login-module> </authentication> </security-domain>修改数据源引用安全域
移除数据源的用户名密码配置,改为引用安全域:<datasource jndi-name="java:jboss/datasources/YourDS" pool-name="YourDS" enabled="true"> <!-- 其他数据源配置 --> <security> <security-domain>AzureKeyVaultDS</security-domain> </security> </datasource>启动WildFly时,安全域会自动调用自定义模块从KeyVault获取凭证,配置文件中无任何敏感信息。
方案三:禁用WildFly配置持久化
若问题源于WildFly启动时自动替换占位符并修改standalone.xml,可直接禁用配置持久化:
添加启动参数
在YAJSW启动脚本中加入JVM参数,禁止WildFly保存配置变更:call java -jar wrapper.jar -c wrapper-wfly-app_Portal.conf -- -Djboss.server.config.persist=false或修改standalone.xml配置
在<server>根元素中添加禁用持久化的配置(WildFly 9支持该配置):<server xmlns="urn:jboss:domain:2.2" persistence="false"> <!-- 其他配置内容 --> </server>此方式下即使WildFly运行时解析了占位符,也不会将实际凭证写入standalone.xml文件。
内容的提问来源于stack exchange,提问作者Viral Thakkar

