Primavera 3.1 Tomcat 6. *Primavera 3.1 Proceso de autenticación LDAP: "Bad credenciales" msg Cuando Credenciales son buenos
estoy trabajando en hacer una aplicación web de Primavera 3.1, la autenticación con LDAP.
Probé las credenciales de LDAP (nombre de usuario, contraseña, URL de ldap, patrón de búsqueda) con un programa Java de estilo JNDI que escribí (citado a continuación). Ese programa funcionó, eliminó todos los atributos de los usuarios, incluida la contraseña, que parece estar encriptada en el servidor LDAP.
Cuando intento iniciar sesión con las mismas credenciales en Spring 3.1, aparece el mensaje de error "Bad Credentials".
Tengo este mensaje en los registros:
DEBUG [org.springframework.security.authentication.ProviderManager:authenticate] (ProviderManager.java:152) - Authentication attempt using org.springframework.security.ldap.authentication.LdapAuthenticationProvider
DEBUG [org.springframework.security.ldap.authentication.AbstractLdapAuthenticationProvider:authenticate] (AbstractLdapAuthenticationProvider.java:51) - Processing authentication request for user: John.A.Smith
DEBUG [org.springframework.security.ldap.authentication.BindAuthenticator:bindWithDn] (BindAuthenticator.java:108) - Attempting to bind as uid=John.A.Smith,ou=People,o=acme.com,o=acme.com
DEBUG [org.springframework.security.ldap.DefaultSpringSecurityContextSource$1:setupEnvironment] (DefaultSpringSecurityContextSource.java:76) - Removing pooling flag for user uid=John.A.Smith,ou=People,o=acme.com,o=acme.com
DEBUG [org.springframework.security.ldap.authentication.BindAuthenticator:handleBindException] (BindAuthenticator.java:152) - Failed to bind as uid=John.A.Smith,ou=People,o=acme.gov: org.springframework.ldap.AuthenticationException: [LDAP: error code 32 - No Such Object]; nested exception is javax.naming.AuthenticationException: [LDAP: error code 32 - No Such Object]
DEBUG [org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter:unsuccessfulAuthentication] (AbstractAuthenticationProcessingFilter.java:340) - Authentication request failed: org.springframework.security.authentication.BadCredentialsException: Bad credentials
En mi * -security.xml He intentado utilizar las etiquetas para hacer una comparación contraseña y codificación ocurren, pero no sirvió de nada. Intenté usar md4, md5, texto plano, sha, sha-256, {ssha}, {sha} en vano.
<s:authentication-manager>
<s:ldap-authentication-provider user-dn-pattern="uid={0},ou=People,o=noaa.gov" >
<s:password-compare hash="md5">
<s:password-encoder hash="md5"/>
</s:password-compare>
</s:ldap-authentication-provider>
</s:authentication-manager>
Mi grupo de redes es una gran org, lento, burocrático. ¿Hay alguna forma de saber qué codificación usan, si es que hay alguna, sin contactarlos?
¿Alguna idea de cosas que podría ver?
Ésta es mi * -security.xml como de mi último intento y la demo de Java LDAP pude conectar con
Gracias.
Mi archivo * -security.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:s="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<s:http auto-config="true" use-expressions="true">
**<s:intercept-url pattern="/welcome*" access="isAuthenticated()" />**
<s:form-login login-page="/login" default-target-url="/welcome"
authentication-failure-url="/loginfailed" />
<s:logout logout-success-url="/logout" />
</s:http>
<s:ldap-server url = "ldap://ldap-itc.sam.acme.com:636/o=acme.com"/>
<s:authentication-manager>
<s:ldap-authentication-provider user-dn-pattern="uid={0},ou=People,o=noaa.gov" />
</s:authentication-manager>
</beans>
Aquí es el programa de estilo de JNDI LDAP de Java que funciona con las mismas credenciales:
import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;
import java.sql.*;
public class LDAPDEMO {
public static void main(String args[]) {
String lcf = "com.sun.jndi.ldap.LdapCtxFactory";
String ldapurl = "ldap://ldap-itc.sam.acme.com:636/o=acme.com";
String loginid = "John.A.Smith";
String password = "passowordforjohn";
DirContext ctx = null;
Hashtable env = new Hashtable();
Attributes attr = null;
Attributes resultsAttrs = null;
SearchResult result = null;
NamingEnumeration results = null;
int iResults = 0;
env.put(Context.INITIAL_CONTEXT_FACTORY, lcf);
env.put(Context.PROVIDER_URL, ldapurl);
env.put(Context.SECURITY_PROTOCOL, "ssl");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "uid=" + loginid + ",ou=People,o=acme.com");
env.put(Context.SECURITY_CREDENTIALS, password);
try {
ctx = new InitialDirContext(env);
attr = new BasicAttributes(true);
attr.put(new BasicAttribute("uid",loginid));
results = ctx.search("ou=People",attr);
while (results.hasMore()) {
result = (SearchResult)results.next();
resultsAttrs = result.getAttributes();
for (NamingEnumeration enumAttributes = resultsAttrs.getAll(); enumAttributes.hasMore();) {
Attribute a = (Attribute)enumAttributes.next();
System.out.println("attribute: " + a.getID() + " : " + a.get().toString());
}// end for loop
iResults++;
}// end while loop
System.out.println("iResults == " + iResults);
}// end try
catch (Exception e) {
e.printStackTrace();
}
}// end function main()
}// end class LDAPDEMO
Solución
Este comentario de Lucas Taylor ayudó a conseguir mi trabajo de configuración:
Su configuración está mal en que tiene "o = acme.com" en la URL del servidor LDAP y también están utilizando " o = acme.com "en el patrón DN de usuario.
Saqué el "o = acme.com" del patrón DN y funcionó el LDAP. Originalmente había puesto "o = acme.com" tanto en el URL LDAP como en el patrón DN porque soy nuevo en Spring 3.1 y LDAP, y eso es similar a cómo se hizo/se hizo en la versión Java JNDI del LDAP demo que escribí en base al código heredado que estoy reemplazando.
Aquí está la versión final y funcional de mi * -seguridad.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:s="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<s:http auto-config="true" use-expressions="true">
**<s:intercept-url pattern="/welcome*" access="isAuthenticated()" />**
<s:form-login login-page="/login" default-target-url="/welcome"
authentication-failure-url="/loginfailed" />
<s:logout logout-success-url="/logout" />
</s:http>
<s:ldap-server url = "ldap://ldap-itc.sam.acme.com:636/o=acme.com"/>
<s:authentication-manager>
<s:ldap-authentication-provider user-dn-pattern="uid={0},ou=People" />
</s:authentication-manager>
</beans>
Voy a explorar su otro comentario y ver si puedo poner la contraseña de codificación de nuevo o si es necesario.
Otra nota. No puede volver a poner la contraseña de codificación, ya que no sabe qué algoritmo está usando el servidor y, en la práctica, podría estar utilizando más de uno. Las contraseñas hash se trata de proteger la base de datos de contraseñas al hacerla más difícil de leer. No se trata de hacer la autenticación del cliente más segura (encontrará muchas discusiones al respecto en SO). Si desea evitar el espionaje en la red desde su aplicación al servidor LDAP, entonces usar una conexión SSL es probablemente la opción más simple. –