2017-07-25 1 views
1

Ich versuche, Spring Data und das LdapRepository API zu verwenden, um Benutzerdaten in Ldap zu lesen, zu aktualisieren und zu erstellen. Ich konnte lesen und erfolgreich zu aktualisieren, aber wenn ich mich diesen Fehler einen neuen Datensatz einzufügen versuchen erhalten:Erstellen neuer Benutzer mit Spring Data LdapRepository schlägt mit LDAP-Fehlercode fehl 32

2017-07-25 17:31:01.966 ERROR 14404 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; 
nested exception is org.springframework.ldap.NameNotFoundException: 
[LDAP: error code 32 - The search base entry '[email protected],ou=people,ou=myou,dc=bar,dc=foo' does not exist]; 
nested exception is javax.naming.NameNotFoundException: 
[LDAP: error code 32 - The search base entry '[email protected],ou=people,ou=myou,dc=bar,dc=foo' does not exist]; remaining name '[email protected]'] 
with root cause 
javax.naming.NameNotFoundException: [LDAP: error code 32 - The search base entry '[email protected],ou=people,ou=myou,dc=bar,dc=foo' does not exist] 

Mein application.properties ist:

user-api.ldap.contextSource.url=ldap://server.address.com:1389 
user-api.ldap.contextSource.userDn=cn=manager role 
user-api.ldap.contextSource.password=apasswordwashere 
user-api.ldap.contextSource.base=ou=people,ou=myou,dc=bar,dc=foo 

Meine Repo-Schnittstelle, LdapUserRepository .java:

public interface LdapUserRepository extends LdapRepository<LdapUser>{ 

    LdapUser findByCn(String cn); 

    LdapUser findBySn(String sn); 

    LdapUser save(LdapUser ldapUser); 
} 

ich die gleiche Antwort, ob ich die speichern Methode explizit aus.

Meine Konfiguration ist in LdapConfiguration.java getan:

@Configuration 
@EnableLdapRepositories(basePackages = "foo.bar.userapi.dao.ldap", ldapTemplateRef="userLdapTemplate") 
public class LdapConfiguration { 

    @Autowired 
    Environment env; 

    @Bean 
    public LdapContextSource contextSource() { 
     LdapContextSource contextSource= new LdapContextSource(); 
     contextSource.setUrl(env.getRequiredProperty("user-api.ldap.contextSource.url")); 
     contextSource.setBase(env.getRequiredProperty("user-api.ldap.contextSource.base")); 
     contextSource.setUserDn(env.getRequiredProperty("user-api.ldap.contextSource.userDn")); 
     contextSource.setPassword(env.getRequiredProperty("user-api.ldap.contextSource.password")); 
     return contextSource; 
    } 

    @Bean(name="userLdapTemplate") 
    public LdapTemplate ldapTemplate() { 
     return new LdapTemplate(contextSource());  
    } 

} 

Und meine Prüfroutine:

public void test() { 
    LdapUser ldapUser = new LdapUser(); 

    ldapUser.setCn("198777777"); 
    ldapUser.setCountry("United States"); 
    ldapUser.setGivenName("Hepsibah"); 
    ldapUser.setIsActive("true"); 
    ldapUser.setSn("Testerson91"); 
    ldapUser.setStatus("active"); 
    ldapUser.setUid(LdapUtils.newLdapName("[email protected]")); 
    ldapUser.setUserModifyTimestamp("20160222145439Z"); 
    ldapUser.setUserPassword("Password-12345"); 
    ldapUser = ldapUserRepository.save(ldapUser); 
} 

Um Stress, die Konfiguration für alles außer Einsätze funktioniert, denn wenn ich so etwas tun funktioniert es:

public void test2() { 
      LdapUser ldapUser = ldapUserRepository.findBySn("Testerson"); 
      if (ldapUser != null) { 
       System.out.println(ldapUser.getUid().toString()); 
       System.out.println("result: " + ldapUser.toString()); 

       ldapUser.setSn("Testerson2"); 
       ldapUser.setUserPassword("Password-12345!"); 
       ldapUser = ldapUserRepository.save(ldapUser); 

       ldapUser = ldapUserRepository.findBySn("Testerson2"); 
       if (ldapUser != null) { 
         System.out.println("result: " + ldapUser.toString()); 
       } 
      } 
    } 

Ich vermute, dass die Antwort mit 0 zu tun sein kann, aber ich gebe das dn während des Speichervorgangs nicht explizit hinzu, und ein Aktualisierungsvorgang funktioniert einwandfrei.

Das Abrufen eines Datensatzes, das Ändern des uid-Werts und das Speichern desselben führt zu demselben Fehler. Das Abrufen eines Datensatzes und das Überprüfen der UID zeigt nur den Teil "[email protected]" und nicht den Teil "ou = people, ou = myou, dc = bar, dc = foo".

+0

Checkout https://stackoverflow.com/questions/33288011/ldaprepository-update-spring-ldap P. – Philip

Antwort

0

Angenommen, die Standardimplementierung wird verwendet (SimpleLdapRepository - Sie erhalten dies, wenn Sie die Repository-Schnittstelle nicht selbst implementiert haben), dann tritt das Problem auf, wenn das SimpleLdapRepository ermittelt, ob es "speichern" oder aktualisieren soll "deine Entität. Von here sieht, dass Code in der SimpleLdapRepository wie folgt aus:

@Override 
public <S extends T> S More ...save(S entity) { 
    Assert.notNull(entity, "Entity must not be null"); 
    Name declaredId = odm.getId(entity); 

    if (isNew(entity, declaredId)) { 
     ldapOperations.create(entity); 
    } else { 
     ldapOperations.update(entity); 
    } 

    return entity; 
} 

Um das der Fehler Sie es sehen, ist wahrscheinlich, dass Ihr Unternehmen neu sein nicht bestimmt wird, das ein Update durchgeführt, die fehlschlägt, wenn das Unternehmen ist gefunden, nicht zu existieren und kann nicht aktualisiert werden.

Die isNew() Methode sieht wie folgt aus:

 private <S extends T> boolean More ...isNew(S entity, Name id) { 
    if (entity instanceof Persistable) { 
     Persistable<?> persistable = (Persistable<?>) entity; 
     return persistable.isNew(); 
    } else { 
     return id == null; 
    } 
} 

In Ihrem Beispiel sieht es aus wie Sie die ID eingestellt sind erforderlich. Die andere Option wäre die Implementierung der Persistable-Schnittstelle und der isNew()-Methode, um zurückzugeben, ob Ihre Entität neu ist oder nicht. Wenn Ihre Entität als neu erkannt wird (Sie können z. B. ldapUser.setNew(true); vor dem Speichern anrufen), wird sie gespeichert und nicht aktualisiert.

+0

Das war perfekt, danke! Ich habe das gespeicherte Objekt geändert in: 'public final class LdapUser implementiert Persistable {...' Dann habe ich auf die ldapuser Klasse, das isNew Mitglied, mit der transienten Annotation, so dass sie es nicht versuchen, in der ldap Tabelle auf ein Feld passen :: ' @Transient privaten boolean isNew; ' Zusammen mit einem Standardsetzer und die Methode, die Sie vorgeschlagen: '@Override \t public boolean isNew() { \t \t Rückkehr this.isNew; \t} ' Und das hat den Trick, wenn ich dieses Feld zu wahren und gespeichert! – Endie

Verwandte Themen