gpt4 book ai didi

spring-mvc - 为什么 Spring LDAP 的 LdapTemplate 不返回标题、部门和公司属性?

转载 作者:行者123 更新时间:2023-12-03 23:33:57 35 4
gpt4 key购买 nike

我正在使用 spring-ldap-core-2.3.1.RELEASE.jarJDK 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类(class) :-
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 用户属性的选项卡,如下图所示:-
enter image description here

另外,来自 一般选项卡中的首字母( initials )属性没有被 Spring-LDAP 的 ldapTemplate 选取/列出. LdapQueryBuilder.query()对象有权访问 attributes(...)方法采用要获取的属性名称的字符串数组。但即使在那里明确提到它们之后,诸如 initials 之类的属性的值仍然存在。 , title , department & company不返回。

LDAP 浏览器 Eclipse IDE 中的插件列出了 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属性值。

最佳答案

人员属性可能是默认情况下不会返回的内部属性。您可以明确指定要返回的属性,但不在您使用的搜索方法中(您传入 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[]{"*","+"};

关于spring-mvc - 为什么 Spring LDAP 的 LdapTemplate 不返回标题、部门和公司属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45295527/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com