Spring MVC 为什么Spring LDAP的LdapTemplate不返回职务、部门和公司属性?

u2nhd7ah  于 2022-11-14  发布在  Spring
关注(0)|答案(3)|浏览(175)

我正在JDK 1.8Tomcat 8.0上使用spring-ldap-core-2.3.1.RELEASE.jar通过LdapTemplate访问AD信息。ldapTemplate.search(..,.,..)方法不会返回titledepartmentcompany等属性。
我使用以下代码行进行搜索:-

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;
    }
}

titledepartmentcompany属性属于AD用户属性的组织选项卡,如下图所示:-x1c 0d1x
此外,在General选项卡中,(initials)属性没有被Spring-LDAP的ldapTemplate拾取/列出。LdapQueryBuilder.query()对象可以访问attributes(...)方法,该方法获取要获取的属性名称的字符串数组。但是,即使在那里显式地提到它们,initialstitledepartmentcompany的值。
Eclipse IDE中的LDAP浏览器插件在组织选项卡下列出了titledepartmentcompany属性,没有任何问题。
甚至com4j API也会返回titledepartmentcompany属性。
是否有任何配置限制了属性列表,或者是Spring-LDAP API本身的限制?这些属性不是BasicAttributes的一部分吗?如何通过Spring-LDAP获取这些属性?

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

即使如此,也不会传回initialstitlecompanydepartment属性值。

bnl4lu3b

bnl4lu3b1#

person属性可能是默认情况下无法返回的内部属性。(传入一个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[]{"*","+"};
qcuzuvrc

qcuzuvrc2#

这是基于你的AttributesMapper,我不知道ADUserAttributesMapper是什么,所以你必须提供那个实现。
下面是此接口的javadoc。http://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/core/AttributesMapper.html

jljoyd4f

jljoyd4f3#

将ldap端口从3268更改为389

相关问题