Estoy manteniendo algún código LDAP heredado de Java. No sé casi nada sobre LDAP.Java, LDAP: ¿Hacer que no ignore las contraseñas en blanco?
El programa siguiente básicamente solo envía el ID de usuario y la contraseña al servidor LDAP, recibe una notificación de vuelta si las credenciales son buenas. Si es así, imprime los atributos LDAP recibidos del servidor LDAP, si no imprime una excepción.
Todo funciona bien si se proporciona una contraseña incorrecta. Se lanza una excepción de "credenciales inválidas". Sin embargo, si se envía una contraseña en blanco al servidor LDAP, aún se realizará la autenticación, los atributos LDAP seguirán siendo devueltos.
¿Es esta situación infeliz debido a que el servidor LDAP permite contraseñas en blanco, o es necesario ajustar el código siguiente para que una contraseña en blanco se alimente al servidor LDAP de forma que se rechace?
Tengo validación de datos en su lugar. Me lo quité en un entorno de prueba para resolver otro problema y noté este problema. Preferiría no tener este problema debajo de la validación de datos.
Gracias de antemano por cualquier información
import javax.naming.*;
import javax.naming.directory.*;
import java.util.*;
import java.sql.*;
public class LDAPTEST {
public static void main(String args[]) {
String lcf = "com.sun.jndi.ldap.LdapCtxFactory";
String ldapurl = "ldaps://ldap-cit.smew.acme.com:636/o=acme.com";
String loginid = "George.Jetson";
String password = "";
DirContext ctx = null;
Hashtable env = new Hashtable();
Attributes attr = null;
Attributes resultsAttrs = null;
SearchResult result = null;
NamingEnumeration results = null;
int iResults = 0;
int iAttributes = 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());
iAttributes++;
}// end for loop
iResults++;
}// end while loop
System.out.println("Records == " + iResults + " Attributes: " + iAttributes);
}// end try
catch (Exception e) {
e.printStackTrace();
}
}// end function main()
}// end class LDAPTEST
Gracias, me dijiste lo que quería saber: si podía o debía hacer algo más allá de mantener una estricta validación de los datos de las contraseñas enviadas. Intenté cambiar a "fuerte" y "SASL" con el código anterior solo para obtener un mensaje de excepción que dijera que el tipo de autenticación no era compatible (¿por el servidor?). Entonces, dado que el servidor no admite nada más, tuve la libertad de seguir adelante. – Steve