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é
相关产品推荐
相关产品推荐

