Estoy intentando autenticar y luego consultar nuestro LDAP corporativo utilizando Spring LDAP y Spring security. Me las arreglé para hacer el trabajo de autenticación, pero cuando intento ejecutar la búsqueda siempre me dan la siguiente excepciónSpring LDAP - enlace para una conexión exitosa
In order to perform this operation a successful bind must be completed on the connection
Después de mucha investigación Tengo la teoría de que después de un autentico y antes de que pueda consultar lo que necesito para unirse a la conexión. Simplemente no sé qué y cómo?
Solo por mencionar que puedo navegar y buscar con éxito nuestro LDAP usando JXplorer, así que mis parámetros son correctos.
Aquí es parte de mi 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" />
He aquí el fragmento de código de LdapAuthenticatorImpl
que realiza la autenticación. No hay problema aquí:
@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!");
}
}
Y aquí hay otro fragmento de código EmployeeDao
con mi inútil intento de consulta:
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);
}
}
Y por último - la excepción que estoy recibiendo
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'
Sé que esto es antiguo, pero @Bostone puede ayudarme a resolver esto.Obtengo exactamente la misma excepción, sin embargo, estoy obteniendo este error en la página de inicio de sesión donde el usuario ingresa las credenciales. El ldap regresa exitosamente cuando se ingresa el nombre de usuario y la contraseña correctos pero recibo el siguiente error: [LDAP: código de error 1 - 00000000: LdapErr: DSID-0C090627, comentario: para realizar esta operación se debe completar un enlace exitoso en la conexión. , datos 0, vece]; remanching name '' – user1647708
@ user1647708 por favor vea mi respuesta a continuación. Funcionó para mí – Bostone