2011-09-29 24 views
5

Ho un'applicazione che utilizza l'autenticazione del database LDAP e semplice per registrare gli utenti. Solo se l'utente non esiste nel contesto LDAP, l'applicazione controlla se esiste nel database. Quindi ho bisogno di un modo per verificare se gli utenti esistono in LDAP, senza conoscere la password. Dico che i nomi utente sono unici.Come posso controllare se esiste un determinato nome utente?

Io uso questo codice, che funziona se ho un nome utente e una password corretti. Se la password O il nome utente sono errati, ottengo un'eccezione. Sarebbe l'ideale se potessi ottenere eccezioni diverse, una se il nome utente non esiste, l'altro se la password fornita è sbagliata.

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()); 
    } 

risposta

3

Si sta cercando un utente in LDAP, utilizzando solo il proprio nome utente. Ma per autenticare su LDAP, stai usando il nome utente cercato e la sua password.

Basta usare un altro utente (amministratore) e una password per l'autenticazione e restituire true se la ricerca dell'utente restituisce qualcosa.

+0

Grazie. Questa è l'unica strada? È obbligatorio effettuare l'accesso per effettuare una ricerca? – radonys

+0

Forse no, non lo so. Sto solo spiegando perché * il tuo * codice ha bisogno della password dell'utente per verificare se esiste nel LDAP. –

+1

Alcuni amministratori consentiranno la ricerca anonima. Verificare con l'amministratore del server di directory. –

Problemi correlati