在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安全组件存储凭证,避免明文暴露:
- 通过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")
- 在注解中引用凭证存储的别名:
@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
相关产品推荐
相关产品推荐

