SuTeCo – Übertragung der Hierarchien vom LDAP zu jOrgChart

25 Okt

Wie in meinem letzten Post bereits erwähnt wurde, wird für die Darstellung des Organigramms das jQuery basierte jOrgChart Plug-In verwendet . Als Eingabe nutzt dieses Plug-In eine einfache HTML-Aufzählungsliste, die aus dem HTML-Dokument gelesen und danach in einer hierarchischen Form abgebildet wird (siehe Abbildungden im Blog 3).

Die einzelnen Organisationseinheiten werden wie auf der Abbildung 1 dargestellt ist, abgebildet.

Abbildung 1. Darstellungsbeispiel einer Organisationseinheit

Um die Eingabe für jOrgChart zu liefern, soll ein bestimmter Teil der LDAP-Struktur vom Django rekursiv gelesen und danach an das Plug-In übertragen werden.Für die zu entwickelnde Web-Applikation muss der Teilbaum „Groups“ mit allen Unterbäumen rekursiv gelesen und im JSON Format gespeichert werden.

Abbildung 2. Beispiel der Baumstruktur (Links)

Da mit JSON beliebig verschachtelte Datenstrukturen möglich sind, eignet sich  dieses Format für die Abbildung der hierarchischen Struktur und für die Netzwerkübertragung der Daten sehr gut.

Um benötige Daten vom LDAP zu bekommen wird das Python Modul „ldap“ eingesetzt. Dieses Modul stellt Funktionen zur Verfügung, die es erlauben, den LDAP-Baum komplett oder nur auf einen Teilbaum begrenzt zu durchsuchen.  Ein  kleines Code-Beispiel wäre:


AUTH_LDAP_SCOPE = ldap.SCOPE_ONELEVEL

scope = AUTH_LDAP_SCOPE

filter = "(&(objectclass=groupOfNames))"
 values = ['cn','owner', 'description', 'member']
 l = ldap.open(AUTH_LDAP_SERVER)
 l.protocol_version = ldap.VERSION3
 l.simple_bind_s(AUTH_LDAP_BASE_USER,AUTH_LDAP_BASE_PASS)
 result_id = l.search('ou=Groups,'+AUTH_LDAP_BASE, scope, filter, values)
 result_type, result_data = l.result(result_id, 1)

for data in result_data[1]:
 if data:
 result_set.append(json.dumps(data))

Ob der ganze Baum oder nur ein Teil davon durchsucht werden soll, entscheidet der SCOPE – Parameter. Dieser kann folgende Werte haben (Abbildung 3):

  • SCOPE_BASE – nur der Startknoten des Baums (Teilbaums) betrachten
  • SCOPE_ONELEVEL – alle Kinderknoten des Startknotens (Startknoten inklusiv) betrachten
  • SCOPE_SUBTREE – der gesamte Baum (Teilbaum) inklusiv Startknoten betrachten

Abbildung 3. Scope Parameter für LDAP-Suche
(Quelle: http://www.idevelopment.info/data/LDAP/LDAP_Resources/SEARCH_Setting_the_SCOPE_Parameter.shtml)

Aus der Beschreibung kann man sehen, dass der Parameter SCOPE_SUBTREE sehr gut für die Suche nach einzelnen Benutzern passt, da  der komplette Baum durchgelaufen wird.

Um die hierarchische Struktur in JSON umzuwandeln, wird aber der Parameter SCOPE_ONELEVEL eingesetzt. Damit kann nur eine Ebene des Baumes durchgelaufen werden. Darauf folgend wird dieselbe Funktion rekursiv aufgerufen, um alle Unterknoten einer Elternknote herausfinden zu können.

Die JSON Datenstruktur, hat danach folgende Form.

<i>{
"cn": "DDI",
"description": "Didaktik der Informatik",
"owner": {
"cn": "ysl",
"title": "Prof. Dr.",
"bcategory": "Leitung",
"etype": "Leiter",
"firstname": "Johannes",
"lastname": "Magenheim",
"fax": "05251 / 60 6336",
"telephone": "05251 / 60 6341",
"adres": "Heinz Nixdorf Institut, Fürstenallee 11,
Paderborn 33102",
"room": "F2.116",
"email": "jsm@uni-paderborn.de",
"description": ""
},
"members": [{"cn": "wolle",
"title": "Dr.",
"bcategory": "wissenschaftlicher Mitarbeiter",
"etype": "Mitarbeiter",
"firstname": "Wolfgang",
"lastname": "Rheinhard",
"fax": "05251 / 60 6336",
"telephone": "05251 / 60 6603",
"adres": "Heinz Nixdorf Institut, Fürstenallee 11,
Paderborn 33102",
"room": "F2.201",
"email": "wolle@uni-paderborn.de"},
{"cn": "jkostik",
"title": "",
"bcategory": "SHW",
"etype": "Student",
"firstname": "Juri",
"lastname": "Kostik",
"fax": "05251 / 60 6336",
"telephone": "05251 / 60 6603",
"adres": "Heinz Nixdorf Institut, Fürstenallee 11,
Paderborn 33102",
"room": "F0.107",
"email": "jkostik@live.uni-paderborn.de"
}],
"sub":"true",
"subtree": [{Untergruppen …..}]
}</i>

Falls jemand eine bessere Idee hat, wie man einen LDAP-Teilbaum mit Python in JSON umwandeln kann, würde ich mich sehr freuen. :)

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: