2012-09-06 19 views
5

Estoy tratando de averiguar cómo Spring LDAP (no la seguridad de Spring) funciona configurando el programa de trabajo más básico, pero parece que la autentificación real se rompe.Uso básico de Spring LDAP

Este es el error que consigo:

 
Exception in thread "main" java.lang.NullPointerException 
    at org.springframework.ldap.core.support.AbstractContextSource.getReadOnlyContext(AbstractContextSource.java:125) 
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:287) 
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:237) 
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:588) 
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:546) 
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:401) 
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:421) 
    at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:441) 

El código que se ejecuta en el método que está lanzando la excepción es:

return getContext(authenticationSource.getPrincipal(), 
        authenticationSource.getCredentials()); 

Así que parece que necesito para configurar una fuente de autenticación en el contexto de la aplicación? Estoy realmente perdido.

Aquí está mi código:

package se.test.connector.ldap; 

import java.util.List; 
import javax.naming.NamingException; 
import javax.naming.directory.Attributes; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.annotation.AnnotationConfigApplicationContext; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.ldap.core.AttributesMapper; 
import org.springframework.ldap.core.DistinguishedName; 
import org.springframework.ldap.core.LdapTemplate; 
import org.springframework.ldap.core.support.LdapContextSource; 
import org.springframework.ldap.filter.EqualsFilter; 

public class LdapTest { 

    public static void main(String[] args) { 
     LdapContextSource ctxSrc = new LdapContextSource(); 
     ctxSrc.setUrl("ldap://<ldapUrl>:389"); 
     ctxSrc.setBase("DC=bar,DC=test,DC=foo"); 
     ctxSrc.setUserDn("<username>@bar.test.foo"); 
     ctxSrc.setPassword("<password>"); 

     LdapTemplate tmpl = new LdapTemplate(ctxSrc); 

     PersonDao dao = new PersonDao(tmpl); 
     dao.getAllPersonNames(); 
    } 

    public static class PersonDao { 

     private LdapTemplate ldapTemplate; 

     public PersonDao(LdapTemplate ldapTemplate) { 
      this.ldapTemplate = ldapTemplate; 
     } 

     public void setLdapTemplate(LdapTemplate ldapTemplate) { 
      this.ldapTemplate = ldapTemplate; 
     } 

     public List getAllPersonNames() { 
      EqualsFilter filter = new EqualsFilter("objectclass", "person"); 
      return ldapTemplate.search(DistinguishedName.EMPTY_PATH, 
        filter.encode(), 
        new AttributesMapper() { 

         public Object mapFromAttributes(Attributes attrs) throws NamingException { 
          return attrs.get("cn").get(); 
         } 
        }); 
     } 
    } 
} 
+1

Upvote porque su ejemplo me ayudó con un problema similar, gracias! :-) – ollo

Respuesta

2

Parece adecuado, en la superficie. Una cosa es que su usuarioDen no es realmente un nombre completo apropiado. Debería estar en el formato "CN=<...>, DC=bar, DC=test, DC=foo". Como no da detalles sobre qué servidor LDAP está utilizando o cómo se ve su estructura de directorios (estructura OU, etc.), es difícil ser más preciso.

+0

Indicado, nunca intenté configurar por separado el usuario "base" y el uid. Intente no establecer la base y establecer UserDN con el DN completo. –

21

Tuve un problema muy similar - también con NullPointerException.

Lo resolvió mi problema era una llamada de afterPropertiesSet():

// ... 

LdapContextSource ctxSrc = new LdapContextSource(); 
ctxSrc.setUrl("ldap://<ldapUrl>:389"); 
ctxSrc.setBase("DC=bar,DC=test,DC=foo"); 
ctxSrc.setUserDn("<username>@bar.test.foo"); 
ctxSrc.setPassword("<password>"); 

ctxSrc.afterPropertiesSet(); /* ! */ 

LdapTemplate tmpl = new LdapTemplate(ctxSrc); 

// ... 
+0

call afterPropertiesSet() resolvió mi problema, mientras yo tenía la misma excepción nullpointer – waterazu

+1

esta es la verdadera respuesta, si tiene un NPE causado por authenticationSource == null – Kooki

+0

Gracias. También olvidé afterPropertiesSet() ... – Peter