2011-09-29 28 views
5

Tengo una aplicación que usa tanto LDAP como autenticación de base de datos simple para registrar usuarios. Solo si el usuario no existe en el contexto LDAP, la aplicación verifica si existe en la base de datos. Entonces necesito una forma de verificar si los usuarios existen en LDAP, sin saber la contraseña. Menciono que los nombres de usuario son únicos.¿Cómo puedo verificar si existe un nombre de usuario dado?

Utilizo este código, que funciona si tengo un nombre de usuario y contraseña correctos. Si la contraseña O el nombre de usuario son incorrectos, recibo una excepción. Sería ideal si pudiera obtener excepciones diferentes, una si el nombre de usuario no existe, otra si la contraseña proporcionada es incorrecta.

String username = "test"; 
    String password = "pass"; 
    Hashtable<String, String> environment = new Hashtable<String, String>(); 
    environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    environment.put(Context.PROVIDER_URL, "ldap://server.example.com:389"); 
    environment.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    String user = username + "@example.com"; 
    environment.put(Context.SECURITY_PRINCIPAL, user); 
    environment.put(Context.SECURITY_CREDENTIALS, password); 
    try 
    { 
     DirContext context = new InitialDirContext(environment); 

     String searchBase = "DC=server,DC=example,DC=COM"; 
     String FILTER = "(&(objectClass=user)(objectCategory=person)((sAMAccountName=" + username + ")))"; 
     SearchControls ctls = new SearchControls(); 
     ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
     NamingEnumeration<SearchResult> answer = context.search(searchBase, FILTER, ctls); 
     SearchResult result = answer.next(); 
     Attribute email = result.getAttributes().get("mail"); 
     Attribute cn = result.getAttributes().get("cn"); 
     System.out.println(cn + " : " + email); 
     context.close(); 
    } 
    catch (AuthenticationException a) 
    { 
     Logger.getLogger().info("Authentication failed: " + a.getExplanation()); 

    } 
    catch (NamingException e) 
    { 
     Logger.getLogger().info("Failed to bind to LDAP: " + e.getExplanation()); 
    } 

Respuesta

3

Está buscando un usuario en LDAP, utilizando solo su nombre de usuario. Pero para autenticarse en LDAP, está utilizando el nombre de usuario buscado y su contraseña.

Simplemente use otro usuario (administrador) y contraseña para autenticarse, y devuelva verdadero si la búsqueda del usuario devuelve algo.

+0

Gracias. ¿Esta es la única manera? ¿Es obligatorio iniciar sesión para hacer una búsqueda? – radonys

+0

Quizás no, no sé. Solo estoy explicando por qué * su * código necesita la contraseña del usuario para verificar si existe en el LDAP. –

+1

Algunos administradores permitirán la búsqueda anónima. Consulte con su administrador de servidor de directorio. –

Cuestiones relacionadas