Der LdapJDBC-Treiber erlaubt es, LDAP-Verzeichnisse über JDBC zu lesen. Mit Hilfe von SQL-Abfragen können damit Daten aus einem LDAP-Server genauso wie aus einer Datenbanktabelle extrahiert und weiterverarbeitet werden.
Zur Abfrage werden LDAP-ObjectClasses als Tabellen angesprochen. Dazu verwendet man drei Komponenten in der Abfrage:
inetOrgPerson, groupOfNames)cn, mail, telephoneNumber)Der Treiber verwendet JNDI (Java Naming and Directory Interface) für die LDAP-Kommunikation und den SQL-Parser von basejdbc für die Query-Verarbeitung.
jdbc:ldap://server:port/baseDN (unverschlüsselt)
jdbc:ldaps://server:port/baseDN (mit SSL/TLS)
Unverschlüsselt (LDAP auf Port 389):
jdbc:ldap://localhost:389/dc=example,dc=com
jdbc:ldap://ldap.myorg.de:389/o=myorg,c=de
Verschlüsselt (LDAPS auf Port 636):
jdbc:ldaps://ldap.company.com:636/dc=company,dc=com
jdbc:ldaps://secure.example.com:636/ou=users,dc=example,dc=com
Die URL besteht aus:
Die Verbindung kann mit Authentifizierung aufgebaut werden.
| Property | Beschreibung | Erforderlich |
|---|---|---|
bindDN |
Der Distinguished Name (DN) für die Authentifizierung | Nein (anonym wenn nicht angegeben) |
password |
Das Passwort für die Authentifizierung | Nein |
Wenn keine Credentials angegeben werden, erfolgt ein anonymer LDAP-Bind:
Connection conn = DriverManager.getConnection(
"jdbc:ldap://localhost:389/dc=example,dc=com");
Properties props = new Properties();
props.setProperty("bindDN", "cn=admin,dc=example,dc=com");
props.setProperty("password", "secret");
Connection conn = DriverManager.getConnection(
"jdbc:ldap://localhost:389/dc=example,dc=com", props);
Für verschlüsselte Verbindungen verwenden Sie jdbc:ldaps:// und Port 636:
Properties props = new Properties();
props.setProperty("bindDN", "cn=admin,dc=example,dc=com");
props.setProperty("password", "secret");
// Verwende ldaps:// und Port 636 für verschlüsselte Verbindung
Connection conn = DriverManager.getConnection(
"jdbc:ldaps://ldap.company.com:636/dc=company,dc=com", props);
Hinweis: Für LDAPS benötigen Sie möglicherweise zusätzliche Java-Konfiguration für SSL-Zertifikate:
// Optional: SSL-Zertifikate konfigurieren
System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
SELECT dn, cn, mail, telephoneNumber
FROM inetOrgPerson
Dies sucht im gesamten Verzeichnisbaum unterhalb des BaseDN nach allen Einträgen mit der ObjectClass inetOrgPerson und gibt die angegebenen Attribute zurück.
Der LdapJDBC-Treiber verwendet die FILTER-Klausel statt WHERE für LDAP-spezifische Filterung. Der FILTER-Ausdruck nutzt die LDAP-Filter-Syntax:
SELECT dn, cn, mail
FROM inetOrgPerson
FILTER (mail=*@example.com)
-- Exakte Übereinstimmung
FILTER (uid=jdoe)
-- Wildcard-Suche
FILTER (cn=John*)
-- Mehrere Bedingungen (UND)
FILTER (&(mail=*@example.com)(ou=IT))
-- Mehrere Bedingungen (ODER)
FILTER (|(title=Manager)(title=Director))
-- Negation
FILTER (!(employeeType=contractor))
Der Treiber unterstützt alle LDAP-ObjectClasses. Häufig verwendete sind:
| ObjectClass | Beschreibung | Typische Attribute |
|---|---|---|
person |
Basis-Person | dn, cn, sn |
organizationalPerson |
Organisatorische Person | cn, sn, title, telephoneNumber, ou |
inetOrgPerson |
Internet-Organisationsperson | uid, cn, sn, mail, givenName, displayName |
groupOfNames |
Gruppe | cn, member |
organizationalUnit |
Organisationseinheit | ou |
Hinweis: Tabellennamen (ObjectClasses) sind case-insensitive und werden automatisch in Kleinbuchstaben konvertiert.
Die verfügbaren Spalten hängen von der ObjectClass ab. Der Treiber:
dn-Spalte ist immer verfügbar und dient als Primary Keydn - Distinguished Name (immer verfügbar, Primary Key)cn - Common Namesn - Surname (Nachname)givenName - Vornamemail - E-Mail-AdressetelephoneNumber - Telefonnummeruid - User IDtitle - Titel/PositiondisplayName - Anzeigenameou - Organizational UnitLDAP-Attribute können mehrere Werte haben (z.B. mehrere E-Mail-Adressen). Der Treiber konkateniert diese mit "; ":
mail = "john@example.com; john.doe@company.com"
Der LdapJDBC-Treiber unterstützt spezielle Systemtabellen für Metadaten:
SELECT table_name, table_type, remarks
FROM system.table_list
WHERE table_name LIKE '%person%'
Liefert alle verfügbaren ObjectClasses (Tabellen).
SELECT column_name, type_name, remarks
FROM system.column_list
WHERE table_name = 'inetorgperson'
Liefert alle verfügbaren Attribute für eine ObjectClass.
SELECT table_name, column_name
FROM system.primary_key_list
WHERE table_name = 'inetorgperson'
Liefert die Primary Key-Spalten (bei LDAP immer dn).
SELECT dn, cn, mail, telephoneNumber
FROM inetOrgPerson
SELECT dn, cn, mail, title
FROM inetOrgPerson
FILTER (mail=*@example.com)
SELECT dn, cn, member
FROM groupOfNames
Das member-Attribut enthält die DNs der Mitglieder, konkateniert mit "; " falls mehrere vorhanden sind.
SELECT dn, ou
FROM organizationalUnit
SELECT dn, cn, mail, title
FROM inetOrgPerson
FILTER (title=*Manager*)
SELECT dn, cn, mail, telephoneNumber
FROM inetOrgPerson
FILTER (&(mail=*@example.com)(|(title=Developer)(title=Engineer)))
Sucht nach Benutzern mit:
Das konzeptionelle Mapping zwischen LDAP und JDBC ist wie folgt:
| LDAP-Konzept | JDBC-Konzept | Beschreibung |
|---|---|---|
| LDAP-Server | Datenbank | Der LDAP-Server enthält die Daten |
| ObjectClass | Tabelle | Eine ObjectClass definiert den Typ der Einträge |
| Entry | Zeile | Ein LDAP-Eintrag entspricht einer Zeile |
| Attribute | Spalte | LDAP-Attribute sind Spalten |
| Distinguished Name (DN) | Primary Key | Der DN identifiziert einen Eintrag eindeutig |
| LDAP-Filter | WHERE/FILTER | Filterung von Einträgen |
SELECT-StatementsFILTER-Klauselsystem.table_list, system.column_list, system.primary_key_list)DatabaseMetaData-FunktionenDer LdapJDBC-Treiber nutzt:
"; " konkateniertDie FILTER-Klausel verwendet die Standard-LDAP-Filter-Syntax (RFC 4515):
| Operator | Bedeutung | Beispiel |
|---|---|---|
= |
Gleichheit | (cn=John Doe) |
* |
Wildcard | (cn=John*) |
& |
UND-Verknüpfung | (&(cn=John*)(mail=*@example.com)) |
| |
ODER-Verknüpfung | (|(title=Manager)(title=Director)) |
! |
Negation | (!(ou=Sales)) |
>= |
Größer-gleich | (uidNumber>=1000) |
<= |
Kleiner-gleich | (uidNumber<=9999) |
Einfacher Filter:
FILTER (uid=jdoe)
Wildcard am Ende:
FILTER (cn=John*)
Wildcard am Anfang:
FILTER (mail=*@example.com)
Wildcard in der Mitte:
FILTER (cn=*Doe*)
UND-Verknüpfung:
FILTER (&(ou=IT)(title=*Developer*))
ODER-Verknüpfung:
FILTER (|(ou=IT)(ou=Development))
Komplexer Filter:
FILTER (&(objectClass=inetOrgPerson)(|(mail=*@example.com)(mail=*@company.com))(!(employeeType=inactive)))
Exportieren Sie alle aktiven Benutzer aus einem LDAP-Verzeichnis:
SELECT dn, uid, cn, mail, telephoneNumber, title
FROM inetOrgPerson
FILTER (!(employeeStatus=inactive))
SELECT cn AS group_name, member
FROM groupOfNames
Mit weiterer Verarbeitung können Sie eine Mitgliedschafts-Matrix erstellen.
SELECT dn, ou
FROM organizationalUnit
SELECT dn, cn, mail, telephoneNumber
FROM inetOrgPerson
FILTER (&(cn=*${searchterm}*)(!(employeeType=inactive)))
Ersetzen Sie ${searchterm} durch die Benutzereingabe.
Finden Sie Benutzer ohne E-Mail-Adresse:
SELECT dn, cn, uid
FROM inetOrgPerson
FILTER (!(mail=*))
Der LdapJDBC-Treiber kann nahtlos in datasqill-Workflows integriert werden:
Schritt 1: LDAP-Daten abfragen
-- Source: LDAP
SELECT dn, uid, cn, mail, telephoneNumber
FROM inetOrgPerson
FILTER (ou=Marketing)
Schritt 2: In Zieldatenbank einfügen
-- Target: PostgreSQL/MySQL/...
INSERT INTO users (ldap_dn, username, full_name, email, phone)
VALUES (?, ?, ?, ?, ?)
Verwenden Sie den Treiber in datasqill, um regelmäßig LDAP-Daten mit einer Datenbank zu synchronisieren.
Ursache: LDAP-Server nicht erreichbar oder falsche URL
Lösung:
telnet ldap.example.com 389jdbc:ldap://server:port/baseDNUrsache: Die ObjectClass enthält das Attribut nicht im Schema
Lösung:
SELECT * FROM system.column_list WHERE table_name = 'objectclass'Ursache: Filter zu restriktiv oder BaseDN falsch
Lösung:
Ursache: Falsches Schema verwendet
Lösung:
system statt xyzFROM system.table_list statt FROM xyz.table_list