You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WildFly 9.0.1启动前动态取数据库凭证,避免写入standalone.xml

解决WildFly 9.0.1动态加载Azure KeyVault凭证且不写入standalone.xml的方案

方案一:通过YAJSW传递JVM系统属性

无需修改standalone.xml核心结构,调整占位符类型后通过启动参数直接传递凭证,避免配置文件被修改。

  1. 修改standalone.xml的数据源配置
    将原环境变量占位符改为JVM系统属性占位符:

    <user-name>${db.user}</user-name>
    <password>${db.password}</password>
    
  2. 调整启动脚本与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动态获取凭证,完全避免配置文件中出现凭证相关内容。

  1. 编写自定义登录模块
    实现WildFly LoginModule接口,在login方法中调用Azure KeyVault工具类获取凭证,并将凭证存入登录上下文。

  2. 配置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>
    
  3. 修改数据源引用安全域
    移除数据源的用户名密码配置,改为引用安全域:

    <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,可直接禁用配置持久化:

  1. 添加启动参数
    在YAJSW启动脚本中加入JVM参数,禁止WildFly保存配置变更:

    call java -jar wrapper.jar -c wrapper-wfly-app_Portal.conf -- -Djboss.server.config.persist=false
    
  2. 或修改standalone.xml配置
    在<server>根元素中添加禁用持久化的配置(WildFly 9支持该配置):

    <server xmlns="urn:jboss:domain:2.2" persistence="false">
        <!-- 其他配置内容 -->
    </server>
    

    此方式下即使WildFly运行时解析了占位符,也不会将实际凭证写入standalone.xml文件。

内容的提问来源于stack exchange,提问作者Viral Thakkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:06:06