2011-03-10 12 views
7

मैं प्रमाणित करने की कोशिश कर रहा हूं और फिर स्प्रिंग एलडीएपी और स्प्रिंग सुरक्षा का उपयोग करके हमारे कॉर्पोरेट एलडीएपी से पूछताछ करता हूं। मैं प्रमाणीकरण काम करने में कामयाब रहे लेकिन जब मैं खोज चलाने के लिए प्रयास मैं हमेशा निम्नलिखित अपवादस्प्रिंग एलडीएपी - सफल कनेक्शन के लिए बाध्य

In order to perform this operation a successful bind must be completed on the connection

काफी अनुसंधान के बाद मैं एक सिद्धांत के बाद मैं प्रमाणित करने और इससे पहले कि मैं क्वेरी कर सकता है कि मैं कनेक्शन करने के लिए बाध्य करने की जरूरत है मिलता है। मुझे नहीं पता कि कैसे और कैसे?

बस उल्लेख करने के लिए - मैं सफलतापूर्वक ब्राउज़ कर सकता हूं और JXplorer का उपयोग करके हमारे एलडीएपी को खोज सकता हूं, इसलिए मेरे पैरामीटर सही हैं।

यहाँ मेरी securityContext.xml

<security:http auto-config='true'> 
    <security:intercept-url pattern="/reports/goodbye.html" 
      access="ROLE_LOGOUT" /> 
    <security:intercept-url pattern="/reports/**" access="ROLE_USER" /> 
    <security:http-basic /> 
    <security:logout logout-url="/reports/logout" 
      logout-success-url="/reports/goodbye.html" /> 
</security:http> 
<security:ldap-server url="ldap://s140.foo.com:1389/dc=td,dc=foo,dc=com" /> 
<security:authentication-manager> 
    <security:authentication-provider ref="ldapAuthProvider"> 
</security:authentication-provider> 
</security:authentication-manager> 
<!-- Security beans --> 
<bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <constructor-arg value="ldap://s140.foo.com:1389/dc=td,dc=foo,dc=com" /> 
</bean> 
<bean id="ldapAuthProvider" 
    class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider"> 
    <constructor-arg> 
     <bean class="foo.bar.reporting.server.security.ldap.LdapAuthenticatorImpl"> 
      <property name="contextFactory" ref="contextSource" /> 
      <property name="principalPrefix" value="TD\" /> 
      <property name="employee" ref="employee"></property> 
     </bean> 
    </constructor-arg> 
    <constructor-arg> 
     <bean class="foo.bar.reporting.server.security.ldap.LdapAuthoritiesPopulator" /> 
    </constructor-arg> 
</bean> 
<!-- DAOs --> 
<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate"> 
    <constructor-arg ref="contextSource" /> 

की धारा है यहाँ LdapAuthenticatorImpl से कोड का टुकड़ा है कि प्रमाणीकरण प्रदर्शन करती है। अपवाद मैं हो रही है

org.springframework.ldap.UncategorizedLdapException: 
    Uncategorized exception occured during LDAP processing; nested exception is 
    javax.naming.NamingException: [LDAP: error code 1 - 00000000: LdapErr: 
    DSID-0C090627, comment: In order to perform this operation a successful bind 
    must be completed on the connection., data 0, vece]; remaining name 
    'DC=TD,DC=FOO,DC=COM' 
+0

मुझे पता है कि यह पुराना है लेकिन @ बोस्टोन क्या आप इसे हल करने में मेरी सहायता कर सकते हैं।मुझे एक ही अपवाद मिल रहा है, हालांकि मुझे यह त्रुटि लॉगिन पेज पर मिल रही है जहां उपयोगकर्ता पहले प्रमाण-पत्र में प्रवेश करता है। सही उपयोगकर्ता नाम और पासवर्ड दर्ज होने पर ldap सफलतापूर्वक लौटाता है लेकिन मुझे निम्न त्रुटि मिलती है: [एलडीएपी: त्रुटि कोड 1 - 00000000: LdapErr: DSID-0C090627, टिप्पणी: इस ऑपरेशन को करने के लिए कनेक्शन पर एक सफल बाध्य पूरा होना चाहिए। , डेटा 0, vece]; नाम remaning '' – user1647708

+0

@ user1647708 कृपया नीचे मेरा जवाब देखें। यह मेरे लिए काम किया – Bostone

उत्तर

4

ऐसा लगता है कि -

public List<Employee> queryEmployeesByName(String query) 
    throws BARServerException { 
    AndFilter filter = new AndFilter(); 
    filter.and(new EqualsFilter("objectclass", "person")); 
    filter.and(new WhitespaceWildcardsFilter("cn", query)); 
    try { 
     // the following line throws bind exception 
     List result = ldapTemplate.search(BASE, filter.encode(), 
      new AttributesMapper() { 
      @Override 
      public Employee mapFromAttributes(Attributes attrs) 
       throws NamingException { 
       Employee emp = new Employee((String) attrs.get("cn").get(), 
        (String) attrs.get("cn").get(), 
         (String) attrs.get("cn").get()); 
       return emp; 
      } 
     }); 
     return result; 
    } catch (Exception e) { 
     throw new BarServerException("Failed to query LDAP", e); 
    } 
} 

और अंत में: यहाँ कोई समस्या नहीं है:

@Override 
public DirContextOperations authenticate(final Authentication authentication) { 
    // Grab the username and password out of the authentication object. 
    final String name = authentication.getName(); 
    final String principal = this.principalPrefix + name; 
    String password = ""; 
    if (authentication.getCredentials() != null) { 
     password = authentication.getCredentials().toString(); 
    } 
    if (!("".equals(principal.trim())) && !("".equals(password.trim()))) { 
     final InitialLdapContext ldapContext = (InitialLdapContext) 
    this.contextFactory.getContext(principal, password); 
     // We need to pass the context back out, so that the auth provider 
     // can add it to the Authentication object. 
     final DirContextOperations authAdapter = new DirContextAdapter(); 
     authAdapter.addAttributeValue("ldapContext", ldapContext); 
     this.employee.setqId(name); 
     return authAdapter; 
    } else { 
     throw new BadCredentialsException("Blank username and/or password!"); 
    } 
} 

और यहाँ क्वेरी करने के लिए मेरी व्यर्थ प्रयास के साथ EmployeeDao से दूसरे कोड स्निपेट है जैसे कि आपके एलडीएपी को बाध्यकारी किए बिना खोज की अनुमति न देने के लिए कॉन्फ़िगर किया गया है (कोई अज्ञात बाध्य नहीं)। इसके अलावा आपने PasswordComparisonAuthenticator लागू किया है और BindAuthenticatorauthenticate को एलडीएपी में लागू नहीं किया है।

आप में कुछ उदाहरणों को देखते हुए बाध्य करने के लिए अपनी queryEmployeesByName() विधि को संशोधित करने का प्रयास कर सकते हैं।

+0

यह एक टिप्पणी की तरह पढ़ता है, आप क्या सुझाव देते हैं? मुझे पता है कि यह संभव है क्योंकि मैं एलडीएपी को जोड़ने और खोजने के लिए जेएक्सप्लोरर (जो जावा ऐप है) का उपयोग कर सकता हूं, मैं बस यह समझ नहीं सकता कि कैसे बांधना है। मुझे लगता है कि मैंने अतीत में BindAuthenticator की कोशिश की और उसी अपवाद – Bostone

+0

@ Droidln.net के साथ समाप्त हुआ। स्पष्ट सुझाव के साथ जवाब संपादित किया। – Raghuram

+0

यह बहुत दस्तावेज़ है जिसे मैं प्रमाणीकरण कोड करता था। जब वे बाध्य/अनबिंड बात कर रहे हैं तो उनका मतलब है कि उस विशेष उदाहरण में रिकॉर्ड डालने/हटाने से – Bostone

3

मैं मुख्य रूप से @ रघुराम उत्तर स्वीकार करने जा रहा हूं क्योंकि यह मुझे सही दिशा में सोच रहा है।

मेरा कोड क्यों विफल रहा था? बाहर निकला - जिस तरह से मैंने इसे तार दिया था, मैं अज्ञात खोज करने की कोशिश कर रहा था जो सिस्टम द्वारा प्रतिबंधित है - इसलिए त्रुटि।

काम करने के लिए ऊपर उदाहरण कैसे दोबारा शुरू करें? पहली बात (उस पर बदसूरत चीज) आपको उपयोगकर्ता का उपयोगकर्ता नाम और पासवर्ड प्रदान करने की आवश्यकता है जिसका उपयोग सिस्टम तक पहुंचने के लिए किया जाएगा। जब आप लॉगिन और प्रमाणीकृत होते हैं तब भी बहुत प्रतिद्वंद्वी, भले ही आप BindAuthenticator सिस्टम का उपयोग कर रहे हों, आपके क्रेडेंशियल्स का पुन: उपयोग करने का प्रयास नहीं करेंगे। ओह। तो तुम इतनी तरह contextSource परिभाषा में 2 मापदंडों छड़ी की जरूरत है:

<bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <constructor-arg value="ldap://foo.com:389/dc=td,dc=foo,dc=com" /> 
    <!-- TODO - need to hide this or encrypt a password --> 
    <property name="userDn" value="CN=admin,OU=Application,DC=TD,DC=FOO,DC=COM" /> 
    <property name="password" value="blah" /> 
</bean> 

कर कि मुझे सामान्य BindAuthenticator और फिर मेरी जावा खोज काम कर रहा शुरू कर दिया

+1

क्या आपने वास्तविक मानों के लिए 'userDn' और 'password' के मानों को सेट किया था? मेरा मतलब है कि अगर मैं ऐसा करता हूं, तो हर कोई इसे सादे पाठ में देखेगा। उदाहरण के लिए मैं लॉगिन फॉर्म से इसे कैसे पढ़ सकता हूं? –

0

मैं एक ही त्रुटि मिली साथ प्रमाणक के कस्टम कार्यान्वयन को बदलने के लिए अनुमति दी है, समाधान नहीं मिला। अंत में मैंने एप्लिकेशन पूल पहचान को नेटवर्क सेवा में बदल दिया और सबकुछ एक आकर्षण की तरह काम करता था। (मेरे पास मेरी साइट पर विंडोज प्रमाणीकरण और अज्ञात सक्षम है)

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