2011-09-29 4 views
5

Mam aplikacji, która używa zarówno LDAP i proste uwierzytelnianie bazy danych do logowania użytkowników. Tylko jeśli użytkownik nie istnieje w kontekście LDAP, aplikacja sprawdza, czy istnieje w bazie danych. Potrzebuję więc sposobu sprawdzenia, czy użytkownicy istnieją w LDAP, bez znajomości hasła. Wspominam, że nazwy użytkowników są unikalne.Jak mogę sprawdzić, czy podana jest nazwa użytkownika?

Używam tego kodu, który działa, jeśli mam poprawną nazwę użytkownika i hasło. Jeśli hasło LUB nazwa użytkownika są błędne, otrzymuję wyjątek. Byłoby idealnie, gdybym mógł uzyskać różne wyjątki, jeden, jeśli nazwa użytkownika nie istnieje, a drugi, jeśli podane hasło jest nieprawidłowe.

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

Odpowiedz

3

Wyszukujesz użytkownika w LDAP, używając tylko jego nazwy użytkownika. Ale aby uwierzytelnić się w LDAP, używasz wyszukanej nazwy użytkownika i jego hasła.

Po prostu użyj innego użytkownika (administratora) i hasła do uwierzytelnienia i zwróć wartość true, jeśli wyszukiwanie użytkownika zwróci coś.

+0

Dzięki. To jest TYLKO sposób? Aby przeprowadzić wyszukiwanie, konieczne jest zalogowanie się? – radonys

+0

Może nie, nie wiem. Właśnie wyjaśniam, dlaczego * twój * kod potrzebuje hasła użytkownika, aby sprawdzić, czy istnieje w LDAP. –

+1

Niektórzy administratorzy zezwalają na anonimowe wyszukiwanie. Skontaktuj się z administratorem serwera katalogów. –