在 Liberty Profile 的 Java 运行 中使用 ldapRegistry 属性

Using ldapRegistry properties in Java running on Liberty Profile

我在 Liberty Profile 上有一些 Java 代码 运行,它使用 MS Active Directory 进行身份验证并进行 LDAP 搜索。该代码使用 JNDI 并执行其预期的操作。问题是 LDAP 参数在 Java 中是硬编码的。有效,但可以改进:

ldap.put(Context.PROVIDER_URL,  "ldap://ad.foo.bar:389");
ldap.put(Context.SECURITY_PRINCIPAL, "CN=account,OU=A,DC=ad,DC=foo,DC=bar");
ldap.put(Context.SECURITY_CREDENTIALS, "apoorlykeptsecret");
...
ldapCtxt = new InitialDirContext(ldap);

是否可以改为从 server.xml 文件中的 ldapRegistry 元素获取 LDAP 属性?还是我走错了路?有没有更好的方法来解决这个问题?

是的,您应该能够使用 server.xml 中的 <ldapRegistry> 元素进行配置。

例如:

<ldapRegistry id="ldap" realm="SampleLdapADRealm" 
    host="ldapserver.mycity.mycompany.com" port="389"
    baseDN="cn=users,dc=adtest,dc=mycity,dc=mycompany,dc=com" 
    bindDN="cn=testuser,cn=users,dc=adtest,dc=mycity,dc=mycompany,dc=com" 
    bindPassword="testuserpwd"
    ldapType="Microsoft Active Directory"> 
  <activedFilters
    userFilter="(&(sAMAccountName=%v)(objectcategory=user))"
    groupFilter="(&(cn=%v)(objectcategory=group))" 
    userIdMap="user:sAMAccountName" 
    groupIdMap="*:cn" 
    groupMemberIdMap="memberOf:member" >
  </activedFilters>
</ldapRegistry>

完整文档请参阅:Configuring LDAP user registries in Liberty

作为另一种快速方法,您可以将这些值作为 JNDI 条目放入 server.xml 配置中,并通过 JNDI 查找在您的应用程序中获取这些值。例如:

<jndiEntry jndiName="ldap/provider_url" value="ldap://ad.foo.bar:389"/>
<jndiEntry jndiName="ldap/secuirty_principal" value="CN=account,OU=A,DC=ad,DC=foo,DC=bar"/>
<!-- WARNING: Storing passwords is JNDI is not secure -->
<jndiEntry jndiName="ldap/security_credentials" value="apoorlykeptsecret"/>


String providerUrl = InitialContext.doLookup("ldap/provider_url");
// etc...