我正在JDK 1.8
和Tomcat 8.0
上使用spring-ldap-core-2.3.1.RELEASE.jar
通过LdapTemplate
访问AD信息。ldapTemplate.search(..,.,..)
方法不会返回title
、department
和company
等属性。
我使用以下代码行进行搜索:-
LdapQuery ldapQuery = LdapQueryBuilder.query()
.where("objectclass").is("user")
.and("objectcategory").is("person")
.and("cn").like(strWildcardText+"*");
ldapTemplate.search(ldapQuery, new ADUserAttributesMapper());
以下是ADUserAttributesMapper
类:-
public class ADUserAttributesMapper implements AttributesMapper<ADUserBean> {
@Override
public ADUserBean mapFromAttributes(Attributes attributes) throws NamingException {
if(attributes==null) {
return null;
}
adUserBean.setName((attributes.get("name")!=null) ? attributes.get("name").get().toString() : null);
adUserBean.setCommonName((attributes.get("cn")!=null) ? attributes.get("cn").get().toString() : null);
adUserBean.setDisplayName((attributes.get("displayname")!=null) ? attributes.get("displayname").get().toString() : null);
adUserBean.setGivenName((attributes.get("givenname")!=null) ? attributes.get("givenname").get().toString() : null); // for FIRST NAME
adUserBean.setMiddleName((attributes.get("initials")!=null) ? attributes.get("initials").get().toString() : null); // for MIDDLE NAME / INITIALS
adUserBean.setLastName((attributes.get("sn")!=null) ? attributes.get("sn").get().toString() : null); // for LAST NAME
adUserBean.setDepartment((attributes.get("department")!=null) ? attributes.get("department").get().toString() : null);
adUserBean.setUserPrincipalName((attributes.get("userprincipalname")!=null) ? attributes.get("userprincipalname").get().toString() : null); // Logon Name
adUserBean.setsAMAccountName((attributes.get("samaccountname")!=null) ? attributes.get("samaccountname").get().toString() : null); // Logon Name (pre-Windows 2000)
adUserBean.setDistinguishedName((attributes.get("distinguishedname")!=null) ? attributes.get("distinguishedname").get().toString() : null);
adUserBean.setMailID((attributes.get("mail")!=null) ? attributes.get("mail").get().toString() : null);
adUserBean.setTitle((attributes.get("title")!=null) ? attributes.get("title").get().toString() : null); // Job Title
adUserBean.setTelephoneNumber((attributes.get("telephonenumber")!=null) ? attributes.get("telephonenumber").get().toString() : null);
adUserBean.setObjectCategory((attributes.get("objectcategory")!=null) ? attributes.get("objectcategory").get().toString() : null);
return adUserBean;
}
}
title
、department
和company
属性属于AD用户属性的组织选项卡,如下图所示:-x1c 0d1x
此外,在General选项卡中,(initials
)属性没有被Spring-LDAP的ldapTemplate
拾取/列出。LdapQueryBuilder.query()
对象可以访问attributes(...)
方法,该方法获取要获取的属性名称的字符串数组。但是,即使在那里显式地提到它们,initials
、title
department
和company
的值。
Eclipse IDE中的LDAP浏览器插件在组织选项卡下列出了title
、department
和company
属性,没有任何问题。
甚至com4j
API也会返回title
、department
和company
属性。
是否有任何配置限制了属性列表,或者是Spring-LDAP API本身的限制?这些属性不是BasicAttributes
的一部分吗?如何通过Spring-LDAP获取这些属性?
更新(2017年8月1日):普通Java JNDI方法/代码不会返回department
、company
、title
属性(即使这些属性在属性字符串数组中明确提及),但令人惊讶的是,它确实返回了initials
属性值。
**更新(2017年8月2日):**类似于@Pierre的建议(如下),尝试使用SearchControls
对象执行以下代码:-
String strFilter= "(&(objectclass=top)(cn=cgma*))";
String[] attrs = new String[] {"cn","givenName","sn","initials","title","department","company"};
long maxResults = 10; // for example
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchControls.setReturningAttributes(attrs);
searchControls.setCountLimit(maxResults);
List<String> aLstOfADUsers = ldapTemplate.search("",strFilter,searchControls,new AttributesMapper<String>()
{
public String mapFromAttributes(Attributes attrs) throws NamingException {
try
{
System.out.println(attrs.toString());
return attrs.get("cn").get().toString();
}
catch(Exception ex) {
ex.printStackTrace();
return null;
}
}
});
return aLstOfADUsers;
即使如此,也不会传回initials
、title
、company
和department
属性值。
3条答案
按热度按时间bnl4lu3b1#
person属性可能是默认情况下无法返回的内部属性。(传入一个LdapQuery对象的类)如果您看一下org.springframework.ldap.core.LdapTemplate类,您似乎不能将SearchControls对象传入到您正在使用的方法签名中。因此,为了能够指定要提取的属性,请替换以下内容:
有了这个:
上面的方法应该可以。你也可以试试这样的方法(我还没有试过):
最后,要取回所有属性,在上面的代码中要求检索所有属性(我上面的示例只要求3个属性,这将返回所有属性):
qcuzuvrc2#
这是基于你的
AttributesMapper
,我不知道ADUserAttributesMapper
是什么,所以你必须提供那个实现。下面是此接口的javadoc。http://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/core/AttributesMapper.html
jljoyd4f3#
将ldap端口从3268更改为389