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

WildFly 12中如何从Elytron凭证存储编程访问密码?

编程访问WildFly 12 Elytron凭证存储中的密码

嘿,我来帮你搞定这个问题!既然你已经用CLI配置好了Elytron凭证存储,接下来用代码访问密码其实很直接,我分步骤给你讲清楚:

1. 先搞定依赖

首先,你的项目需要引入WildFly Elytron的凭证存储API。如果用Maven的话,添加下面的依赖就行——注意版本要和WildFly 12自带的Elytron版本匹配(WildFly 12对应的Elytron版本是1.6.1.Final左右),而且因为WildFly容器本身已经自带这些类,所以scope设为provided就好:

<dependency>
    <groupId>org.wildfly.security</groupId>
    <artifactId>wildfly-elytron-credential-store</artifactId>
    <version>1.6.1.Final</version>
    <scope>provided</scope>
</dependency>

2. 核心代码实现

下面是完整的Java代码示例,注释里已经写清楚每一步的作用:

import org.wildfly.security.credential.store.CredentialStore;
import org.wildfly.security.credential.store.CredentialStoreException;
import org.wildfly.security.password.Password;
import org.wildfly.security.password.interfaces.ClearPassword;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

public class ElytronCsAccessor {

    public static String getDbPassword() throws CredentialStoreException {
        // 1. 配置凭证存储的参数,对应你CLI里的设置
        Map<String, String> csAttributes = new HashMap<>();
        // 获取WildFly的数据目录路径(容器内运行时自动存在这个系统属性)
        String serverDataDir = System.getProperty("jboss.server.data.dir");
        // 拼接凭证存储文件的绝对路径
        String storeAbsolutePath = new File(serverDataDir, "credentials/csstore.jceks").getAbsolutePath();
        csAttributes.put("location", storeAbsolutePath);
        csAttributes.put("keyStoreType", "JCEKS"); // 因为你用的是JCEKS格式的存储

        // 2. 创建并初始化凭证存储实例
        CredentialStore credentialStore = CredentialStore.getInstance("KeyStoreCredentialStore", csAttributes);
        // 用你创建存储时设置的密码(也就是CLI里的changeit)初始化
        char[] storePassword = "changeit".toCharArray();
        credentialStore.initialize(null, storePassword);

        // 3. 获取指定别名的密码(对应你CLI里的db_password别名)
        Password storedPassword = credentialStore.retrieveCredential("db_password", Password.class);

        // 4. 转换为明文(如果存储的是明文密码的话)
        if (storedPassword instanceof ClearPassword) {
            ClearPassword clearPwd = (ClearPassword) storedPassword;
            return new String(clearPwd.getPassword());
        }

        // 如果存储的是加密后的密码,需要对应处理,这里先抛出提示
        throw new IllegalArgumentException("不支持的密码类型,请检查凭证存储的密码格式");
    }

    public static void main(String[] args) {
        try {
            String dbPwd = getDbPassword();
            System.out.println("成功获取数据库密码:" + dbPwd);
        } catch (CredentialStoreException e) {
            e.printStackTrace();
        }
    }
}

3. 几个关键注意事项

  • 运行环境:如果是把代码打包成WAR部署到WildFly里运行,jboss.server.data.dir这个系统属性会自动由容器提供,不用手动设置;如果是在外部独立运行这个程序,你需要手动通过-Djboss.server.data.dir=/path/to/your/wildfly/standalone/data来指定路径。
  • 权限问题:确保运行程序的用户对csstore.jceks文件有读写权限,不然会抛出权限异常。
  • 密码安全:千万别把凭证存储的密码(比如示例里的changeit)硬编码在代码里!可以通过环境变量、外部配置文件或者WildFly的系统属性来传入,避免泄露。
  • 密码类型适配:如果你在CLI里用secret-value而不是clear-text添加的别名,存储的密码类型可能不是ClearPassword,这时候需要用对应的密码解码API来处理,比如EncryptablePassword的解密逻辑。

内容的提问来源于stack exchange,提问作者André

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:18