2010-08-11 13 views
9
public static void main(String[] args) 
{ 
    String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory"; 
    String MY_HOST = "ldap://Localhost:1389"; 
    String MGR_DN = "cn=John,ou=Users,o=IT,dc=QuizPortal"; 
    String MGR_PW = "password";   

    //Identify service provider to use 
    Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX); 
    env.put(Context.PROVIDER_URL, MY_HOST); 
    env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    env.put(Context.SECURITY_PRINCIPAL, MGR_DN); 
    env.put(Context.SECURITY_CREDENTIALS, MGR_PW); 

    try 
    { 
     // Create the initial directory context 
     InitialDirContext initialContext = new InitialDirContext(env); 

     System.out.println("Context Sucessfully Initialized"); 
    } 
    catch(Exception e) 
    { 
     System.err.println(e); 
    } 
} 

मैं पूछना चाहूंगा कि जब मैं MGR_DN = "cn=John,ou=Users,o=IT,dc=QuizPortal" को MGR_DN = "uid=103,ou=Users,o=IT,dc=QuizPortal" पर सेट करता हूं। मूल रूप से सीएन से यूआईडी में बदलना, मुझे एक त्रुटि का सामना करना होगाजेएनडीआई का उपयोग कर एलडीएपी उपयोगकर्ता पासवर्ड प्रमाणीकरण

javax.naming.AuthenticationException: [LDAP: error code 49 - Invalid Credentials] 

मुझे cn=John के रूप में निर्दिष्ट होने पर प्रमाणित किया गया है लेकिन uid=103 नहीं है। क्या मुझे यूआईडी द्वारा निर्दिष्ट करने की अनुमति नहीं है?

उत्तर

4

आपको डीएन या विशिष्ट नाम निर्दिष्ट करना होगा। यही वह नाम है जिसे उपयोगकर्ता निर्देशिका में बाध्य करता है। आप केवल गुणों की किसी भी श्रृंखला का चयन नहीं कर सकते हैं। यदि आपके उपयोगकर्ता 'सीएन' विशेषता के माध्यम से बंधे हैं तो केवल 'सीएन' विशेषता डीएन का हिस्सा है।

+0

ओह ... धन्यवाद! समझे ... यह सोच रहा था कि यह क्यों काम नहीं करता ... धन्यवाद – Nivek

+0

यह एलडीएपी निर्देशिका पर निर्भर करता है। कुछ वैकल्पिक नामकरण विशेषताओं को अनुमति देते हैं जिसमें यूआईडी = 103 काम कर सकता है। जबकि अन्य नहीं करेंगे। तो यह एक विश्वसनीय दृष्टिकोण नहीं है। – geoffc

2

यह एक सर्वर कॉन्फ़िगरेशन समस्या की तरह दिखता है। Here's a similar problem including a solution। मूल रूप से आपको ldap-authentication.properties में प्रमाणीकरण के लिए uid या cn का उपयोग करना होगा या नहीं।

+0

सटीक रूप से जो मैं खोज रहा था, धन्यवाद – ThePrince

8

यदि आप पहले से सटीक डीएन नहीं जानते हैं, तो आपको पहले एलडीएपी निर्देशिका में एक खोज करना चाहिए। यह कम या ज्यादा इस तरह (सुनिश्चित करें कि आप प्रासंगिक अपवादों को पकड़ने करना) किया जा सकता है:

Properties env = new Properties(); 
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
env.put(Context.PROVIDER_URL, ldapServerUrl); 
env.put(Context.SECURITY_AUTHENTICATION, "none"); 

SearchControls searchCtrls = new SearchControls(); 
searchCtrls.setReturningAttributes(new String[] {}); 
searchCtrls.setSearchScope(SearchControls.SUBTREE_SCOPE); 

String filter = "(&(cn=" + identifier + "))"; 

DirContext ctx = null; 
ctx = new InitialDirContext(env); 
NamingEnumeration<SearchResult> answer = ctx.search(
    ldapBaseDN, filter, searchCtrls); 

String fullDN = null; 
if (answer.hasMore()) { 
    fullDN = answer.next().getNameInNamespace(); 

    ctx.close(); 
    ctx = null; 

    env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    env.put(Context.SECURITY_PRINCIPAL, fullDN); 
    env.put(Context.SECURITY_CREDENTIALS, password); 

    ctx = new InitialDirContext(env); 
    return true; 
} 
// Exception otherwise ... 

यहाँ, खोज फ़िल्टर "(&(cn=" + identifier + "))" है (इसलिए, उदाहरण के (&(cn=John)) के लिए), लेकिन आप uid बजाय इस्तेमाल कर सकते हैं। परिणामों की विशिष्टता एलडीएपी सर्वर की कॉन्फ़िगरेशन पर निर्भर करती है। बेस डीएन यह भी सेट अप करने के तरीके पर निर्भर करता है (यह आपके उदाहरण में ou=Users,o=IT,dc=QuizPortal हो सकता है)।

+0

ओह .. अतिरिक्त जानकारी के लिए धन्यवाद .. – Nivek

+0

यह केवल पूर्ण डीएन प्राप्त करने में आपकी सहायता करेगा जब आपके पास केवल यूआईडी या सीएन है, उदाहरण के लिए। आम तौर पर, कुछ एलडीएपी सर्वर एक उपट्री में अद्वितीय यूआईडी रखने के लिए कॉन्फ़िगर किए जाते हैं। खोज करने से आपको सही उपयोगकर्ता ढूंढने में मदद मिलती है। उदाहरण के लिए, यदि आपने अपने एलडीएपी पेड़ को कई उप-पेड़ ('ou = marketing' और' ou = Finances' उदाहरण के लिए) रखने के लिए व्यवस्थित किया है, तो 'uid = user1, ou = marketing, o = MyCompany' और' uid 'के साथ = user2, ou = Finances, o = MyCompany' और इसे 'o = MyCompany' में अद्वितीय यूआईडी का उपयोग करने के लिए कॉन्फ़िगर किया गया है, आप उस प्रकार का उपयोग करके' uid = user1' (जिसे आपको प्रमाणीकृत करने की आवश्यकता है) के साथ उपयोगकर्ता का पूरा डीएन मिल सकता है खोज। – Bruno

+0

हे साझा करने के लिए धन्यवाद। अब मुझे एलडीएपी की बेहतर समझ है :) बीटीडब्ल्यू, कोड का आपका टुकड़ा एक आकर्षण की तरह काम करता है। धन्यवाद! – Nivek