Spring LDAP - binden für die erfolgreiche Verbindung
Ich versuche, sich zu authentifizieren und dann Fragen zu unserer Unternehmens-LDAP-mit Spring LDAP und Spring security. Ich schaffte Authentifizierung arbeiten, aber wenn ich Versuch zu laufen, Suche ich bekomme immer die folgende Ausnahme
Um diesen Vorgang auszuführen eine erfolgreiche Bindung muss abgeschlossen sein, auf die Verbindung
Nach viel recherche habe ich eine Theorie, dass, nachdem ich zu authentifizieren und bevor ich eine Abfrage, die ich zu binden, müssen Verbindung. Ich weiß nur nicht was und wie?
Nur zu erwähnen - ich kann navigieren und durchsuchen Sie unsere LDAP mit JXplorer also meine Parameter korrekt sind.
Hier ein Abschnitt von meinem 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" />
Hier das code-snippet aus LdapAuthenticatorImpl
, der die Authentifizierung durchführt. Kein problem hier:
@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!");
}
}
Und hier ist noch ein code-snippet aus EmployeeDao
mit meinem vergeblichen Versuch, Abfrage:
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);
}
}
Und schließlich - die Ausnahme, ich bin immer
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'
- Ich weiß, das ist alt, aber @Bostone können Sie mir helfen, Sortieren Sie diese aus. Ich bin immer genau die gleiche Ausnahme, aber ich bin immer diese Fehlermeldung auf der login-Seite, wo Benutzer zum ersten mal öffnet Anmeldeinformationen. Die ldap-erfolgreich zurückgegeben wird, wenn Sie Benutzernamen und Passwort korrekt eingegeben, aber ich bekomme folgenden Fehler: [LDAP: error code 1 - 00000000: LdapErr: DSID-0C090627, Kommentar: um diesen Vorgang auszuführen eine erfolgreiche Bindung muss abgeschlossen sein, auf die Verbindung., Daten 0, zum Abendessen schwebt ]; verbliebenen Namen "
- bitte siehe meine Antwort unten. Bei mir hat es geklappt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie Sie Ihre LDAP konfiguriert ist, nicht zulassen, dass eine Suche ohne die Bindung an Sie (kein anonymous bind). Auch Sie implementiert haben
PasswordComparisonAuthenticator
und nichtBindAuthenticator
zu authentifizieren auf LDAP.Könnten Sie versuchen, ändern Sie Ihre
queryEmployeesByName()
- Methode zu binden und dann suchen Sie, einen Blick auf einige Beispiele in der doc.Werde ich übernehmen @Raghuram Antwort vor allem, weil es hat mich zum nachdenken in die richtige Richtung.
Warum mein code wurde nicht? Stellte sich heraus - die Art, wie ich verkabelt es ich habe versucht, führen Sie die anonyme Suche ist verboten, durch die system - daher der Fehler.
Wie rewire-Beispiel oben? Erstes (und hässliche Ding an, dass) Sie zur Verfügung stellen müssen Benutzernamen und Kennwort des Benutzers, der verwendet wird, um auf das system zuzugreifen. Nicht sehr eingängig, auch wenn Sie sich anmelden und authentifiziert werden, auch wenn Sie mit der
BindAuthenticator
system werde nicht versuchen, verwenden Sie Ihre Anmeldeinformationen. Mist. So dass Sie haften müssen 2 Parameter incontextSource
definition etwa so:Tun, die mir erlaubt, Sie zu ersetzen eine benutzerdefinierte Implementierung der Echtheitsbestätigung, die mit generischen
BindAuthenticator
und dann mein Java Suche begannuserDn
undpassword
den realen Werten? Ich meine, wenn ich dies tun, jeder wird es sehen im Klartext. Wie kann ich es Lesen zum Beispiel über ein login-Formular?Ich habe den gleichen Fehler, konnte keine Lösung finden.
Schließlich änderte ich die Identität des Anwendungspools auf Netzwerkdienst, und alles funktionierte wie ein Charme.
(Ich habe die windows-Authentifizierung und anonym aktiviert, auf meiner Website)