Java 未绑定不返回请求的LDAP属性。为什么?

Java 未绑定不返回请求的LDAP属性。为什么?,java,active-directory,ldap,unboundid-ldap-sdk,Java,Active Directory,Ldap,Unboundid Ldap Sdk,我编写了一个程序,读取Web服务,检索用户数据,然后将数据推送到ActiveDirectory,从而更新用户的标题、地址、电话号码等 问题是,当我使用未绑定连接类执行搜索时,请求的属性不会返回。以下是搜索代码: SearchResult result = connection.search( properties.getProperty("ldap.search.baseDN"), SearchScope.SUB, "(cn=" + userId

我编写了一个程序,读取Web服务,检索用户数据,然后将数据推送到ActiveDirectory,从而更新用户的标题、地址、电话号码等

问题是,当我使用未绑定连接类执行搜索时,请求的属性不会返回。以下是搜索代码:

SearchResult result = connection.search( properties.getProperty("ldap.search.baseDN"), 
                        SearchScope.SUB, "(cn=" + userId + ")", 
                        "personalTitle", "department", "company", "manager", "telephoneNumber", 
                        "streetAddress", "I", "st", "postalCode", "c", "pager", "mobile", 
                        "fax", "cn");
上面的代码定位所需的用户,cn属性按预期返回,但其他属性都无法返回。如果我使用相同的连接凭据使用JXplorer连接到AD,我可以看到所有所需的属性都存在,但不会返回

我尝试替换SearchRequest.ALL_OPERATIONAL_属性、SearchRequest.ALL_USER_属性和SearchRequest.REQUEST_ATTRS_默认值,而不是显式列出字段,但没有成功

我还查看了从“connection.getSchema()”返回的“Schema”对象,可以看到personalTitle应该存在:

connection.getSchema().getAttributeType("personalTitle")
上述代码返回:

1.2.840.113556.1.2.615名称“personalTitle”语法“1.3.6.1.4.1.1466.115.121.1.15”单值

那么这可能是一个用户权限问题?有没有人经历过这种情况并知道如何解决

谢谢,
Mike

LDAP搜索结果条目只包含实际具有值的属性,因此您在未绑定LDAP SDK中看到的行为是适当和正确的。即使显式请求某个特定属性,该属性只有在具有一个或多个值时才会包含在条目中

我认为您被JXplorer弄糊涂了,因为它正在读取模式以根据其对象类确定条目中可能包含哪些属性,并向您显示这些属性,以便您可以在编辑器中为这些属性设置值。但这并不意味着服务器返回的条目实际上包含关于这些属性的任何信息

要验证这一点,可以使用ldap SDK提供的ldap调试器工具查看实际发生的ldap通信。只需运行如下命令:

 tools/ldap-debugger --hostname {directory-server-address} \
      --port {directory-server-port} --listenPort {listen-port}
这将创建一个非常简单的LDAP代理服务器,对通过它的所有请求和响应进行解码。要使用它,只需将JXplorer指向指定的侦听端口。您将看到,当JXplorer检索条目时,服务器返回的条目将只包含实际具有值的属性


如果要确定可以包含在给定条目中的所有可能属性,请使用LDAPConnection.getSchema方法检索服务器架构,然后检索目标条目中每个对象类的schema.getObjectClass,最后,使用ObjectClassDefinition.getRequiredAttributes和ObjectClassDefinition.getOptionalAttributes方法查看该对象类的条目中必须使用和可能使用的属性类型。

您在这方面非常熟悉!非常感谢。我尝试了connection.getSchema(),并验证了要填充的字段是否可用。正如您所说,它们当前没有任何值。