Gehüpft wie gesprungen?

Zugriff auf Verzeichnisdienste mit Spring LDAP

Stefan Zörner

Spring LDAP bietet mit dem LdapTemplate einen Zugriff auf Verzeichnisdienste wie zum Beispiel Active Directory oder OpenLDAP in einer Form, wie sie durch andere Templates innerhalb von Spring z.B. für JDBC oder Hibernate etabliert ist. In diesem Artikel werden Stärken und Schwächen der Lösung beleuchtet.

Der Zugriff auf LDAP-Server aus Java erfolgt, auch wenn es durchaus Alternativen gibt, in den allermeisten Fällen mit JNDI (Java Naming and Directory Interface). Bei der Benutzung dieser Schnittstelle macht man ähnliche Erfahrungen wie mit reinem JDBC (Java Database Connectivity): Verbindungen müssen geöffnet und geschlossen, an jeder Stelle Checked Exceptions behandelt und Suchergebnisse mühsam iteriert werden. Das Spring Framework ist bei Entwicklern unter anderem beliebt, weil sie durch Templates von derartigen Lasten größtenteils befreit werden, im Falle von JDBC etwa durch das JdbcTemplate. Mit Spring LDAP steht eine entsprechende Lösung auch für Verzeichnisdienste zur Verfügung, wie Spring selbst unter der Apache-Lizenz.

JndiTemplate vs. LdapTemplate

Das schon länger in Spring enthaltene JndiTemplate adressiert in erster Linie den Namensdienstaspekt von JNDI und erleichtert zum Beispiel den Zugriff auf konfigurierte Ressourcen wie Datenbankverbindungen. Grundsätzlich könnte man damit auch allgemeine LDAP-Operationen absetzen, indem man die Schnittstelle JndiCallback implementiert, dem Ansatz fehlt aber jede Eleganz.

Das LdapTemplate von Spring LDAP hingegen setzt ebenfalls auf JNDI auf, bietet aber unmittelbare Unterstützung für wichtige LDAP-Operationen an. Hierzu zählen neben dem Anlegen, Manipulieren und Ändern von Informationen in einem Verzeichnis vor allem das Suchen von Einträgen mit bestimmten Attributwerten.
Das Template orientiert sich an den Methodensignaturen der JNDI-Schnittstelle DirContext, ohne dabei allerdings alle überladenen Methoden (insbesondere von search) anzubieten. Des Weiteren fehlen LDAP-spezifische Methoden, die in der JNDI-Schnittstelle LdapContext vereinbart sind, zum Beispiel für Extended Operations (Stichwort StartTLS). LdapTemplate bietet Schnittstellen für Callbacks an, mit denen man an die fehlende Funktionalität dieser beiden Interfaces trotzdem herankommt.

Zum Leistungsumfang des Frameworks zählen darüber hinaus Hilfsklassen, um LDAP-typische Dinge wie DNs und Suchfilter zu konstruieren, Callbacks, um etwa Suchergebnisse in Java-Objekte umzuwandeln, und Integrationen für einzelne fortgeschrittene JNDI-Themen, wie zum Beispiel Object Factories. Verwendet werden kann die Lösung innerhalb von Spring-Anwendungen im Stile der üblichen Bean-Definitionen. Abbildung 1 zeigt eine typische Konfiguration in der Spring IDE. Auch der Einsatz als „klassische“ Bibliothek über den direkten API-Zugriff ist denkbar. Eine Abhängigkeit zum Spring Framework besteht aber in jedem Fall.

Das schon länger in Spring enthaltene JndiTemplate adressiert in erster Linie den Namensdienstaspekt von JNDI und erleichtert zum Beispiel den Zugriff auf konfigurierte Ressourcen wie Datenbankverbindungen. Grundsätzlich könnte man damit auch allgemeine LDAP-Operationen absetzen, indem man die Schnittstelle JndiCallback implementiert, dem Ansatz fehlt aber jede Eleganz.

Das LdapTemplate von Spring LDAP hingegen setzt ebenfalls auf JNDI auf, bietet aber unmittelbare Unterstützung für wichtige LDAP-Operationen an. Hierzu zählen neben dem Anlegen, Manipulieren und Ändern von Informationen in einem Verzeichnis vor allem das Suchen von Einträgen mit bestimmten Attributwerten.
Das Template orientiert sich an den Methodensignaturen der JNDI-Schnittstelle DirContext, ohne dabei allerdings alle überladenen Methoden (insbesondere von search) anzubieten. Des Weiteren fehlen LDAP-spezifische Methoden, die in der JNDI-Schnittstelle LdapContext vereinbart sind, zum Beispiel für Extended Operations (Stichwort StartTLS). LdapTemplate bietet Schnittstellen für Callbacks an, mit denen man an die fehlende Funktionalität dieser beiden Interfaces trotzdem herankommt.

Zum Leistungsumfang des Frameworks zählen darüber hinaus Hilfsklassen, um LDAP-typische Dinge wie DNs und Suchfilter zu konstruieren, Callbacks, um etwa Suchergebnisse in Java-Objekte umzuwandeln, und Integrationen für einzelne fortgeschrittene JNDI-Themen, wie zum Beispiel Object Factories. Verwendet werden kann die Lösung innerhalb von Spring-Anwendungen im Stile der üblichen Bean-Definitionen. Abbildung 1 zeigt eine typische Konfiguration in der Spring IDE. Auch der Einsatz als „klassische“ Bibliothek über den direkten API-Zugriff ist denkbar. Eine Abhängigkeit zum Spring Framework besteht aber in jedem Fall.

Abb. 1: Eine Konfiguration des LdapTemplate in der Spring IDE
Fehlerbehandlung

LDAP-spezifische Fehler werden von JNDI durch eigene Exceptions dargestellt, wobei ein klares Mapping von Fehlercodes auf die zahlreichen Exceptions existiert. Spring LDAP verpackt diese Exceptions selbst wieder in eine Runtime Exception (Unterklassen von Springs DataAccessException), um den Entwickler von der erforderlichen Behandlung der Fehlersituation zu befreien. Dieses Anliegen hat die Lösung mit anderen Templates innerhalb von Spring gemein. Leider landen in Spring LDAP Version 1.1.2 noch sehr viele Exceptions in einer UncategorizedLdapException, sodass die eigentliche JNDI Exception ausgepackt und untersucht werden muss, wenn an geeigneter Stelle eine detaillierte Fehlerbehandlung erfolgen soll.

Dankenswerterweise ist die Abbildung von NamingException auf DataAccessException im LdapTemplate durch Implementierung eines Interfaces anpassbar, und zukünftige Fassungen versprechen hier deutliche Verbesserungen.

Fazit

Nach meiner Einschätzung ist Spring LDAP eine 80:20-Lösung. Für eine Vielzahl von Anwendungsfällen ermöglicht es ein sehr elegantes Programmieren gegen Verzeichnisdienste in gewohnter Template-Manier. Entwickler mit Spring-Kenntnissen fühlen sich zu Hause. Die Dokumentation ist reich an Beispielen. Allerdings darf nicht vergessen werden, dass bereits JNDI eine Abstraktion von LDAP darstellt und Spring LDAP diese Schicht ein weiteres Mal umhüllt und beschränkt. Für fortgeschrittene LDAP-Aufgaben muss in JNDI getrickst werden, und das gilt bei Spring LDAP umso mehr. Ich persönlich wäre mit einem Template, das auf einer expliziten LDAP-Bibliothek (z.B. Netscape) aufsetzt und diese „springifiziert“, glücklicher.

Stefan Zörner arbeitet als Berater und Trainer bei der oose Innovative Informatik GmbH in Hamburg. Er ist Autor des Buches „LDAP für Java-Entwickler“ und seit 2005 als Committer im Apache Directory Project aktiv.
Geschrieben von
Stefan Zörner
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.