2017-07-25 11 views
5

के माध्यम से एडी जानकारी तक पहुंचने के लिए spring-ldap-core-2.3.1.RELEASE.jarJDK 1.8 & Tomcat 8.0 पर उपयोग कर रहा हूं। title, department & company जैसे गुण ldapTemplate.search(..,.,..) विधि द्वारा वापस नहीं लौटाए जा रहे हैं।वसंत एलडीएपी के LdapTemplate शीर्षक, विभाग और कंपनी विशेषताओं को वापस क्यों नहीं करता है?

मैं कोड के निम्नलिखित लाइनों खोज करने के लिए उपयोग कर रहा हूँ: - ADUserAttributesMapper वर्ग

LdapQuery ldapQuery = LdapQueryBuilder.query() 
             .where("objectclass").is("user") 
             .and("objectcategory").is("person") 
             .and("cn").like(strWildcardText+"*"); 
ldapTemplate.search(ldapQuery, new 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 विशेषताओं संगठन से संबंध रखते हैं एडी उपयोगकर्ता गुणों का टैब नीचे दी गई छवि में दिखाया गया है: - enter image description here

इसके अलावा, जनरल टैब से संक्षिप्त नाम (जैसे initials) विशेषता वसंत-एलडीएपी के ldapTemplate द्वारा उठाया जा रहा है/सूचीबद्ध। LdapQueryBuilder.query() ऑब्जेक्ट की attributes(...) विधि तक पहुंच है जो प्राप्त करने वाले नामों की एक स्ट्रिंग सरणी लेती है। लेकिन उन्हें स्पष्ट रूप से उल्लेख करने के बाद भी, initials, title, department & company जैसे गुणों के लिए मान वापस नहीं आये हैं।

ग्रहण आईडीई के भीतर एलडीएपी ब्राउज़र प्लगइन एक समस्या के बिना title, department & companyसंगठन टैब के अंतर्गत गुण सूचीबद्ध करता है।

भी com4j एपीआई title, department & company गुण देता है।

क्या कोई विन्यास है जो विशेषता (ओं) सूची को सीमित कर रहा है या क्या यह स्प्रिंग-एलडीएपी एपीआई के साथ ही सीमित है? क्या ये गुण BasicAttributes का हिस्सा नहीं हैं? स्प्रिंग-एलडीएपी के माध्यम से इन विशेषताओं को कैसे लाया जाए?

अद्यतन (01-Aug-2017): सादा जावा JNDI दृष्टिकोण/कोड department, company, title विशेषताओं वापसी नहीं करता है (यहां तक ​​कि इन विशेषताओं को स्पष्ट रूप से गुण स्ट्रिंग सरणी में उल्लेख किया जा रहा के साथ), लेकिन आश्चर्यजनक रूप से यह initials विशेषता मान वापस करता है।

अद्यतन (02-Aug-2017): @ पियरे के सुझाव (नीचे) निम्नलिखित कोड 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 विशेषता मान।

उत्तर

1

यह आपके AttributesMapper पर आधारित है। मुझे नहीं पता कि ADUserAttributesMapper क्या है, इसलिए आपको उस कार्यान्वयन को प्रदान करना होगा।

यहां इस इंटरफ़ेस के लिए जावाडोक है। http://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/core/AttributesMapper.html

+0

हाय रयान, प्रतिक्रिया के लिए thanx। यहां, 'ADUserAttributesMapper' एक कक्षा है जो 'org.springframework.ldap.core.AttributesMapper' इंटरफ़ेस लागू करती है। यह जावा POJO बीन के गुणों में प्राप्त गुणों को मानचित्र करता है। क्या यह एलडीएपी क्वेरी खोज से लौटाए गए गुणों की संख्या को सीमित करता है? क्या कोई अन्य मैपर है? – Shiva

+0

क्या आप इस कार्यान्वयन को शामिल करने के लिए अपना प्रश्न अपडेट कर सकते हैं? – ryan2049

3

व्यक्ति विशेषताएँ आंतरिक विशेषताएं हो सकती हैं जिन्हें आप डिफ़ॉल्ट रूप से वापस नहीं प्राप्त करेंगे। आप स्पष्ट रूप से निर्दिष्ट कर सकते हैं कि आप कौन से विशेषताओं को लौटाना चाहते हैं लेकिन आप जिस खोज विधि का उपयोग कर रहे हैं उसमें नहीं (वह एक जहां आप 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[]{"*","+"}; 
+0

हाय पेरे, प्रतिक्रिया के लिए thanx। मैंने आपके सुझाए गए कोड की कोशिश की लेकिन यह 'शून्य' सूचक अपवाद फेंकता है और वर्ग 'विशिष्ट नाम' को भी हटा दिया गया है। – Shiva

+0

कृपया प्रश्न क्षेत्र में ऊपर ** अपडेट (02-Aug-2017) ** देखें। – Shiva

+0

@ शिवा: मैं अन्य संभावनाओं के बारे में सोचने की कोशिश कर रहा हूं और जो दिमाग में आता है वह यह है कि शायद आप किसी डोमेन नियंत्रक (डीसी) से कनेक्ट हो रहे हैं जिसमें इन सभी विशेषताओं में शामिल नहीं है। क्या आप पुष्टि कर सकते हैं कि जिस यूआरएल का उपयोग आप एलडीएपी से कनेक्ट करने के लिए करते हैं वह आपके कोड में आपके एलडीएपी ब्रोसर के स्क्रीनशॉट में से एक जैसा है? यदि नहीं, तो उसमें देखो। अन्यथा, मुझे यकीन नहीं है कि क्या गलत है, यह विशेषता वास्तव में वहां होनी चाहिए ... – Pierre

संबंधित मुद्दे

 संबंधित मुद्दे