2010-08-11 26 views
9
public static void main(String[] args) 
{ 
    String INITCTX = "com.sun.jndi.ldap.LdapCtxFactory"; 
    String MY_HOST = "ldap://Localhost:1389"; 
    String MGR_DN = "cn=John,ou=Users,o=IT,dc=QuizPortal"; 
    String MGR_PW = "password";   

    //Identify service provider to use 
    Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, INITCTX); 
    env.put(Context.PROVIDER_URL, MY_HOST); 
    env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    env.put(Context.SECURITY_PRINCIPAL, MGR_DN); 
    env.put(Context.SECURITY_CREDENTIALS, MGR_PW); 

    try 
    { 
     // Create the initial directory context 
     InitialDirContext initialContext = new InitialDirContext(env); 

     System.out.println("Context Sucessfully Initialized"); 
    } 
    catch(Exception e) 
    { 
     System.err.println(e); 
    } 
} 

me gustaría preguntar cuando me puse la MGR_DN = "cn=John,ou=Users,o=IT,dc=QuizPortal" a MGR_DN = "uid=103,ou=Users,o=IT,dc=QuizPortal". Básicamente se cambia de CN a uid, me gustaría encontrar un errorLDAP autenticación de contraseña de usuario utilizando JNDI

javax.naming.AuthenticationException: [LDAP: error code 49 - Invalid Credentials] 

estoy autenticado cuando se especifica como cn=John pero no uid=103. ¿No puedo especificar por uid?

Respuesta

4

Debe especificar el DN o el nombre completo. Ese es el nombre que el usuario está obligado como en el directorio. No puedes simplemente seleccionar cualquier cadena de atributos. Si sus usuarios están vinculados mediante el atributo 'cn', entonces solo el atributo 'cn' es parte del DN.

+0

¡Oh ... GRACIAS! Entendido ... me preguntaba por qué no funcionó ... GRACIAS – Nivek

+0

Depende del directorio LDAP. Algunos permiten atributos de nomenclatura alternativos, en cuyo caso uid = 103 podría funcionar. Mientras que otros no lo harán. Por lo tanto, no es un enfoque confiable. – geoffc

2

Parece un problema de configuración del servidor. Here's a similar problem including a solution. Básicamente, deberá especificar si desea usar uid o cn para la autenticación en ldap-authentication.properties.

+0

Precisamente lo que estaba buscando, gracias – ThePrince

8

Si no conoce el DN exacto por adelantado, primero debe realizar una búsqueda en el directorio LDAP. Esto se puede hacer más o menos así (asegurarse de que captura las excepciones pertinentes):

Properties env = new Properties(); 
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
env.put(Context.PROVIDER_URL, ldapServerUrl); 
env.put(Context.SECURITY_AUTHENTICATION, "none"); 

SearchControls searchCtrls = new SearchControls(); 
searchCtrls.setReturningAttributes(new String[] {}); 
searchCtrls.setSearchScope(SearchControls.SUBTREE_SCOPE); 

String filter = "(&(cn=" + identifier + "))"; 

DirContext ctx = null; 
ctx = new InitialDirContext(env); 
NamingEnumeration<SearchResult> answer = ctx.search(
    ldapBaseDN, filter, searchCtrls); 

String fullDN = null; 
if (answer.hasMore()) { 
    fullDN = answer.next().getNameInNamespace(); 

    ctx.close(); 
    ctx = null; 

    env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    env.put(Context.SECURITY_PRINCIPAL, fullDN); 
    env.put(Context.SECURITY_CREDENTIALS, password); 

    ctx = new InitialDirContext(env); 
    return true; 
} 
// Exception otherwise ... 

Aquí, el filtro de búsqueda es "(&(cn=" + identifier + "))" (así, por ejemplo (&(cn=John))), pero se puede utilizar el uid lugar. La exclusividad de los resultados depende de la configuración del servidor LDAP. El DN base también depende de la forma en que está configurado (podría ser ou=Users,o=IT,dc=QuizPortal en su ejemplo).

+0

Oh ... Gracias por la información adicional .. – Nivek

+0

Eso solo lo ayudará a obtener el DN completo cuando solo tenga el uid o cn, por ejemplo. Normalmente, algunos servidores LDAP están configurados para tener uids únicos en un subárbol. Hacer la búsqueda lo ayuda a encontrar el usuario correcto. Por ejemplo, si ha organizado su árbol LDAP para tener múltiples subárboles ('ou = Marketing' y' ou = Finances' por ejemplo), con 'uid = user1, ou = Marketing, o = MyCompany' y' uid = user2, ou = Finances, o = MyCompany' y configurado para usar uids únicos en 'o = MyCompany', puede encontrar el DN completo del usuario con' uid = user1' (que necesita autenticar) usando ese tipo de buscar. – Bruno

+0

Hola, gracias por compartir. Ahora entiendo mejor LDAP :) Por cierto, tu código funciona como un amuleto. ¡Gracias! – Nivek

Cuestiones relacionadas