我使用spring-ldap-core-2.3.1.RELEASE.jar
而不是JDK 1.8
& Tomcat 8.0
通过LdapTemplate
访问AD信息。 title
,department
&等属性company
方法未返回ldapTemplate.search(..,.,..)
。
我正在使用以下代码行进行搜索: -
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
&amp; company
属性属于AD用户属性的组织标签,如下图所示: -
此外,从常规标签中,Spring-LDAP initials
未提取/列出姓名缩写(ldapTemplate
)。 LdapQueryBuilder.query()
对象可以访问attributes(...)
方法,该方法接受要提取的字符串数组属性名称。但即使在明确提及它们之后,initials
,title
,department
等属性的值也是如此。 <{1}}不会被退回。
Eclipse IDE中的 LDAP Browser 插件列出了company
,title
&amp; 组织标签下的department
属性没有问题。
即使company
API返回com4j
,title
&amp; department
属性。
是否存在限制属性列表的任何配置,或者它是否是Spring-LDAP API本身的限制?这些属性不属于company
吗?如何通过Spring-LDAP获取这些属性?
更新(2017年8月1日):
普通的 Java JNDI 方法/代码不返回BasicAttributes
,department
,company
属性(即使属性字符串数组中明确提到这些属性),但令人惊讶的是,它确实返回title
属性值。
更新(2017年8月2日):
类似于@Pierre的建议(下面)使用initials
对象尝试了以下代码: -
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
&amp; company
属性值。
答案 0 :(得分:4)
人物属性可能是内部属性,默认情况下您不会返回。您可以明确指定要返回的属性,但不能在您正在使用的搜索方法中使用(您传入LdapQuery对象的方法)。如果你看一下org.springframework.ldap.core.LdapTemplate类,看起来你可以将SearchControls对象传递给你正在使用的方法签名。因此,为了能够指定要获取的属性,请将其替换为:
LdapQuery ldapQuery = LdapQueryBuilder.query()
.where("objectclass").is("user")
.and("objectcategory").is("person")
.and("cn").like(strWildcardText+"*");
ldapTemplate.search(ldapQuery, new ADUserAttributesMapper());
有了这个:
LikeFilter filter = new LikeFilter("cn", strWildcardText+"*");
// list of attributes to retrieve
String[] attrs = new String[] {"title","department","company"};
long maxResults = 10; // for example
SearchControls searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchControls.setReturningAttributes(attrs);
searchControls.setCountLimit(numResults);
ldapTemplate.search(DistinguishedName.EMPTY_PATH, filter.encode(), searchControls, new ADUserAttributesMapper());
以上应该有效。你也可以尝试这样的事情(我还没有尝试过):
ldapTemplate.search( "dc=yourorg,dc=com",
"(&(cn=" +strWildcardText + "*)(&(objectClass=person)(objectcategory=person)))",
SearchControls.SUBTREE_SCOPE,
new String[]{ "title","department","company" },
new ADUserAttributesMapper() );
最后,要获取所有属性,请在上面的代码中检索所有属性(上面的示例仅询问3个属性,这将返回所有属性):
String[] attrs = new String[]{"*","+"};
答案 1 :(得分:1)
这取决于您的AttributesMapper
。我不知道ADUserAttributesMapper
是什么,所以你必须提供这种实现。
这是这个界面的javadoc。 http://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/core/AttributesMapper.html