2010-01-31 13 views
25

Estoy jugando con LDAP y la búsqueda de Java. Aquí está mi exportación LDIF con una organización sencilla¿Cómo hago una búsqueda LDAP/autenticar contra este LDAP en Java

version: 1 

dn: dc=example,dc=com 
objectClass: organization 
objectClass: dcObject 
objectClass: top 
dc: example 
o: MyOrganization 
description: Test Description 

dn: ou=people, dc=example,dc=com 
objectClass: organizationalUnit 
objectClass: top 
ou: people 
description: All users in demo company 

dn: cn=Johnny Doe,ou=people,dc=example,dc=com 
objectClass: organizationalPerson 
objectClass: person 
objectClass: inetOrgPerson 
objectClass: top 
cn: Johnny Doe 
sn: Johnny 
homephone: 123-456-7890 
mail: [email protected] 
ou: Development 
uid: jjohnny 
userpassword:: johnny 

dn: cn=Samuel Johnson,ou=people,dc=example,dc=com 
objectClass: organizationalPerson 
objectClass: person 
objectClass: inetOrgPerson 
objectClass: top 
cn: Samuel Johnson 
sn: Samuel 
homephone: 123-456-7890 
mail: [email protected] 
ou: Accounts 
uid: ssam 
userpassword:: sammy 

¿Cómo se ejecuta un fragmento de Java para obtener todos los usuarios del servidor LDAP? No hay configuración de autenticación en mi servidor de directorio de Apache DS.

Hashtable env = new Hashtable(11); 
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
env.put(Context.PROVIDER_URL, "ldap://localhost:10389/dc=example,dc=com"); 
env.put(Context.SECURITY_AUTHENTICATION, "none"); 

try { 
    // Create initial context 
    DirContext ctx = new InitialDirContext(env); 
    Object obj = new Object(); 
    // want to print all users from the LDAP server 
    System.out.println(obj.toString()); 
    ctx.close(); 
} 

Respuesta

38
try { 
     LdapContext ctx = new InitialLdapContext(env, null); 
     ctx.setRequestControls(null); 
     NamingEnumeration<?> namingEnum = ctx.search("ou=people,dc=example,dc=com", "(objectclass=user)", getSimpleSearchControls()); 
     while (namingEnum.hasMore()) { 
      SearchResult result = (SearchResult) namingEnum.next();  
      Attributes attrs = result.getAttributes(); 
      System.out.println(attrs.get("cn")); 

     } 
     namingEnum.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

private SearchControls getSimpleSearchControls() { 
    SearchControls searchControls = new SearchControls(); 
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
    searchControls.setTimeLimit(30000); 
    //String[] attrIDs = {"objectGUID"}; 
    //searchControls.setReturningAttributes(attrIDs); 
    return searchControls; 
} 
+0

Gracias! eso me ayudó! – Satish

44

Otro enfoque está utilizando UnboundID. Su API es muy fácil de leer y más corto

crear una conexión LDAP

public static LDAPConnection getConnection() throws LDAPException { 
    // host, port, username and password 
    return new LDAPConnection("com.example.local", 389, "[email protected]", "admin"); 
} 

resultado Get filtro

public static List<SearchResultEntry> getResults(LDAPConnection connection, String baseDN, String filter) throws LDAPSearchException { 
    SearchResult searchResult; 

    if (connection.isConnected()) { 
     searchResult = connection.search(baseDN, SearchScope.ONE, filter); 

     return searchResult.getSearchEntries(); 
    } 

    return null; 
} 

Obtener todas las Unidades oragnization y contenedores

String baseDN = "DC=com,DC=example,DC=local"; 
String filter = "(&(|(objectClass=organizationalUnit)(objectClass=container)))"; 

LDAPConnection connection = getConnection();   
List<SearchResultEntry> results = getResults(connection, baseDN, filter); 

Obtener una unidad de organización específica

String baseDN = "DC=com,DC=example,DC=local"; 
String dn = "CN=Users,DC=com,DC=example,DC=local"; 

String filterFormat = "(&(|(objectClass=organizationalUnit)(objectClass=container))(distinguishedName=%s))"; 
String filter = String.format(filterFormat, dn); 

LDAPConnection connection = getConnection(); 

List<SearchResultEntry> results = getResults(connection, baseDN, filter); 

Obtener todos los usuarios en virtud de una unidad organizativa

String baseDN = "CN=Users,DC=com,DC=example,DC=local"; 
String filter = "(&(objectClass=user)(!(objectCategory=computer)))"; 

LDAPConnection connection = getConnection();  
List<SearchResultEntry> results = getResults(connection, baseDN, filter); 

Obtener un usuario específico de una unidad organizativa

String baseDN = "CN=Users,DC=com,DC=example,DC=local"; 
String userDN = "CN=abc,CN=Users,DC=com,DC=example,DC=local"; 

String filterFormat = "(&(objectClass=user)(distinguishedName=%s))"; 
String filter = String.format(filterFormat, userDN); 

LDAPConnection connection = getConnection(); 
List<SearchResultEntry> results = getResults(connection, baseDN, filter); 

Visualizar resultado

for (SearchResultEntry e : results) { 
    System.out.println("name: " + e.getAttributeValue("name")); 
} 
5

También puede utilizar el siguiente código:

package com.agileinfotech.bsviewer.ldap; 

import java.util.Hashtable; 
import java.util.ResourceBundle; 

import javax.naming.Context; 
import javax.naming.NamingException; 
import javax.naming.directory.DirContext; 
import javax.naming.directory.InitialDirContext; 

public class LDAPLoginAuthentication { 
    public LDAPLoginAuthentication() { 
     // TODO Auto-generated constructor 
    } 

    ResourceBundle resBundle = ResourceBundle.getBundle("settings"); 

    @SuppressWarnings("unchecked") 
    public String authenticateUser(String username, String password) { 
     String strUrl = "success"; 
     Hashtable env = new Hashtable(11); 
     boolean b = false; 
     String Securityprinciple = "cn=" + username + "," + resBundle.getString("UserSearch"); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, resBundle.getString("InitialContextFactory")); 
     env.put(Context.PROVIDER_URL, resBundle.getString("Provider_url")); 
     env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     env.put(Context.SECURITY_PRINCIPAL, Securityprinciple); 
     env.put(Context.SECURITY_CREDENTIALS, password); 

     try { 
      // Create initial context 
      DirContext ctx = new InitialDirContext(env); 
      // Close the context when we're done 
      b = true; 
      ctx.close(); 

     } catch (NamingException e) { 
      b = false; 
     } finally { 
      if (b) { 
       strUrl = "success"; 
      } else { 
       strUrl = "failer"; 
      } 
     } 
     return strUrl; 
    } 
} 
+0

ATENCIÓN, tenga en cuenta que esta implementación podría permitir a los usuarios autenticarse con una contraseña vacía. Consulte https://stackoverflow.com/questions/12359831/java-ldap-make-it-not-ignore-blank-passwords. Dependiendo de la implementación del servidor LDAP, también deberá verificar que el parámetro de contraseña no esté vacío. – Mossroy

Cuestiones relacionadas