为什么Spring LDAP的LdapTemplate没有返回title,department&公司属性?

时间:2017-07-25 06:31:41

标签: spring-mvc active-directory jndi spring-ldap ldap-query

我使用spring-ldap-core-2.3.1.RELEASE.jar而不是JDK 1.8& Tomcat 8.0通过LdapTemplate访问AD信息。 titledepartment&等属性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;
    }
}

titledepartment&amp; company属性属于AD用户属性的组织标签,如下图所示: - enter image description here

此外,从常规标签中,Spring-LDAP initials未提取/列出姓名缩写(ldapTemplate)。 LdapQueryBuilder.query()对象可以访问attributes(...)方法,该方法接受要提取的字符串数组属性名称。但即使在明确提及它们之后,initialstitledepartment等属性的值也是如此。 <{1}}不会被退回。

Eclipse IDE中的 LDAP Browser 插件列出了companytitle&amp; 组织标签下的department属性没有问题。

即使company API返回com4jtitle&amp; department属性。

是否存在限制属性列表的任何配置,或者它是否是Spring-LDAP API本身的限制?这些属性不属于company吗?如何通过Spring-LDAP获取这些属性?

更新(2017年8月1日): 普通的 Java JNDI 方法/代码不返回BasicAttributesdepartmentcompany属性(即使属性字符串数组中明确提到这些属性),但令人惊讶的是,它确实返回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; initialstitle&amp; company属性值。

2 个答案:

答案 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