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 389
jdbc:ldap://server:port/baseDN
Ursache: 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 xyz
FROM system.table_list
statt FROM xyz.table_list