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

在WildFly中从环境变量或属性文件读取@LdapIdentityStoreDefinition的bindDnPassword

解决WildFly中@LdapIdentityStoreDefinition加载非明文密码的问题

我正尝试实现从环境变量或属性文件加载密钥的通用安全模式,需要在Jakarta EE注解@LdapIdentityStoreDefinition中加载OpenLDAP管理员用户的密码。我的问题和Payara容器的相关问题类似,但针对WildFly环境。当前使用搭载JDK 21的WildFly Docker镜像quay.io/wildfly/wildfly:32.0.0.Final-1-jdk21,暂未考虑迁移到Payara,但作为个人项目也不排斥(此前已从Tomcat迁移到WildFly)。

我已验证明文密码可正常工作,但不能将明文密码提交到代码中,曾尝试使用表达式#{login.bindDnPassword}(代码如下)但未成功:

@LdapIdentityStoreDefinition(
        url = "ldap://openldap:389",  // Replace with your server details
        callerBaseDn = "cn=admin,dc=example,dc=org",
        groupSearchBase = "dc=example,dc=org",
        bindDn = "cn=admin,dc=example,dc=org",
//        bindDnPassword ="#{login.bindDnPassword}" // bind Distinguished Name
)

可行解决方案

方案1:直接引用环境变量或系统属性

WildFly支持在注解中通过EL表达式直接引用环境变量或系统属性,修改注解配置:

@LdapIdentityStoreDefinition(
        url = "ldap://openldap:389",
        callerBaseDn = "cn=admin,dc=example,dc=org",
        groupSearchBase = "dc=example,dc=org",
        bindDn = "cn=admin,dc=example,dc=org",
        bindDnPassword = "${env.OPENLDAP_ADMIN_PASSWORD}" // 引用环境变量
)

如果要引用WildFly系统属性,可在启动时通过参数传递:

./standalone.sh -Dlogin.bindDnPassword=your_ldap_password

然后注解中使用:

bindDnPassword = "${login.bindDnPassword}"

方案2:使用WildFly Elytron凭证存储

利用WildFly自带的Elytron安全组件存储凭证,避免明文暴露:

  1. 通过JBoss CLI创建凭证存储:
./jboss-cli.sh
/subsystem=elytron/credential-store=ldapStore:add(location=ldap.store, relative-to=jboss.server.config.dir, credential-reference={clear-text=store_encrypt_password})
/subsystem=elytron/credential-store=ldapStore:add-alias(alias=ldapBindPwd, secret-value="your_ldap_admin_password")
  1. 在注解中引用凭证存储的别名:
@LdapIdentityStoreDefinition(
        url = "ldap://openldap:389",
        callerBaseDn = "cn=admin,dc=example,dc=org",
        groupSearchBase = "dc=example,dc=org",
        bindDn = "cn=admin,dc=example,dc=org",
        bindDnPassword = "${elytron.credential-store.ldapStore.ldapBindPwd}"
)

方案3:编程式创建身份存储

如果注解式EL表达式不生效,可通过编程方式结合MicroProfile Config加载密码:

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.security.enterprise.identitystore.IdentityStore;
import jakarta.security.enterprise.identitystore.LdapIdentityStoreDefinition;
import org.eclipse.microprofile.config.inject.ConfigProperty;

@ApplicationScoped
public class LdapIdentityStoreProducer {

    @ConfigProperty(name = "login.bindDnPassword")
    private String bindPassword;

    public IdentityStore produceLdapIdentityStore() {
        return new LdapIdentityStoreDefinition.LdapIdentityStoreBuilder()
                .url("ldap://openldap:389")
                .callerBaseDn("cn=admin,dc=example,dc=org")
                .groupSearchBase("dc=example,dc=org")
                .bindDn("cn=admin,dc=example,dc=org")
                .bindDnPassword(bindPassword)
                .build();
    }
}

此方案需要确保WildFly启用了MicroProfile Config扩展(WildFly 32默认已支持),可通过microprofile-config.properties文件或环境变量配置login.bindDnPassword。

内容的提问来源于stack exchange,提问作者Andre Leon Rangel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:47:40