PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘Zend_Ldap’ tag

Einen LDAP-Server/ActiveDirectory administrieren mit Zend_Ldap

with 2 comments

Ein Directory-Server zur zentralen Administration von Benutzeraccounts, Adressbüchern und anderen Resourcen aller Art ist eine feine Sache, sobald man mehrere Rechner, Dienste und/oder Benutzer zu administrieren hat. Nicht nur im Firmenumfeld, auch zu Hause haben IT-Spezies mehr und mehr einen LDAP (Leightweight Directory Access Protocol)-kompatiblen Server, der die genannten Informationen zentral zur Verfügung stellt.

Ohne hier detailliert auf die Vorteile eingehen zu wollen, kann man zum Beispiel viele Dienste mit den zentralen Benutzeraccounts auf dem LDAP-Server verbinden (evtl. mittels Samba, aber das soll hier nicht Thema sein), und so braucht sich ein Benutzer nur ein Passwort merken und dieses regelmäßig ändern anstatt für jeden Dienst einen eigenen Account zu haben. Ein Benutzer kann sich dann beispielsweise an jedem Rechner der Firma anmelden, sein Email-Kennwort ist das selbe, der FTP-Zugang ist auch automatisch verfügbar mit dem selben Kennwort, es können Rechte zentral verwaltet werden, und im Falle des Ausscheidens des Mitarbeiters muss man nur einen Account löschen und er hat nirgends mehr Zugriff. Natürlich können auch alle Intranet-Webseiten dann diese Login-Informationen nutzen, sodass nicht auf jeder Intranetseite ein separater Account angelegt und verwaltet werden muss (Stichwort Zend_Auth_Adapter_Ldap). Soweit die Theorie.

Auch ist es möglich, sein Adressbuch auf einem LDAP-Server zu speichern und dieses dann von überall nutzen zu können: via Webapplikation, Thunderbird, Outlook, Mail.app, wohlmöglich ein Software-IP-Telefon und und und. Das geht zum Beispiel nicht mit einer Datenbank.

Es gibt im Großen und Ganzen 2 bekannte Produkte auf dem Markt: OpenLDAP und ActiveDirectory von Microsoft. Beide Dienste bieten die oben genannten angerissenen Möglichkeiten und lassen sich via LDAP abfragen und manipulieren.

Nun zu PHP und Zend_Ldap: Wir können uns also zum LDAP-Dienst verbinden und dort neue Objekte anlegen, diese editieren, löschen, verschieben und vieles mehr. Im Folgenden zeige ich Euch am Beispiel von einem OpenLDAP-Server, wie man das sehr einfach machen kann.

Noch einige Grundlagen, damit der Code auch verständlicher ist:

  • Wurzel: Die Wurzel eines LDAP-Servers ist häufig eine Organisation (o) oder eine Domain (wird dann via dc benannt)
  • ou: Organisational Unit, wird zur Strukturierung (vgl. „Ordner“) genutzt, sodass sich ein Baum bildet
  • dn: Distinguished Name, das ist der vollständige Pfad zu einem Objekt
  • objectclass: Ein Objekt gehört mindestens einer (strukturellen) Klasse an, die die Attribute bestimmt und soetwas wie eine Schablone ist
  • … weitere Informationen finden sich im entsprechenden LDAP-Wikipedia Eintrag.

Die Baumstruktur sieht dann beispielsweise so aus:

PHPLdapAdmin

Ein Objekt in diesem Baum sieht dann zum Beispiel so aus:

Bild von Wikipedia

Und so greifen wir dann darauf zu:

$options = array(
    'host'              => '10.12.13.14',
    'username'          => 'cn=michael,ou=Users,dc=test,dc=de',
    'password'          => '123456',
    'bindRequiresDn'    => true,
    'accountDomainName' => 'test.de',
    'baseDn'            => 'dc=test,dc=de',
);

$ldap = new Zend_Ldap($options);
$ldap->bind();

Wir übergeben dem Konstruktor also die nötigen Daten und authentifizieren uns (bind()). Danach können wir, wenn die Authentifizierung geklappt hat und wir die entsprechenden Rechte in den OUs haben, Daten abfragen, zum Beispiel ein bestimmtes Objekt holen:

$user1 = $ldap->getEntry('cn=user1,ou=michael,ou=Addressbook,dc=test,dc=de');
/* array(
 *    'dn'          => 'cn=user1,ou=michael,ou=Addressbook,dc=test,dc=de',
 *    'cn'          => array('user1'),
 *    'givenname'   => array('Klaus'),
 *   ....
 */

Ein Objekt verändern ist auch sehr einfach:

$user1 = $ldap->getEntry('cn=user1,ou=michael,ou=Addressbook,dc=test,dc=de');
Zend_Ldap_Attribute::setAttribute($user1, 'displayName', 'User Eins');
$ldap->update('cn=user1,ou=michael,ou=Addressbook,dc=test,dc=de', $user1);

Ein neues Objekt fügen wir folgendermaßen hinzu:

$user2 = array();
Zend_Ldap_Attribute::setAttribute($user2, 'cn', 'UserZwei');
Zend_Ldap_Attribute::setAttribute($user2, 'objectClass', 'inetorgPerson');
$ldap->add('cn=UserZwei,ou=michael,ou=Addressbook,dc=test,dc=de', $user2);

Ein Objekt löschen könnte einfacher nicht sein:

$ldap->delete('cn=UserZwei,ou=michael,ou=Addressbook,dc=test,dc=de');

Suchen können wir natürlich auch nach verschiedenen Kriterien, beispielsweise so:

$filter1  = Zend_Ldap_Filter::begins('cn', 			$searchString);
$filter2  = Zend_Ldap_Filter::begins('sn', 			$searchString);
$filter3  = Zend_Ldap_Filter::begins('gn', 			$searchString);
$filter4  = Zend_Ldap_Filter::contains('displayname', 	$searchString);
$filter5  = Zend_Ldap_Filter::contains('mail', 			$searchString);

$filter = Zend_Ldap_Filter::orFilter($filter1, $filter2, $filter3, $filter4, $filter5);
$results1 = $ldap->searchEntries($filter);
$results2 = $ldap->search($filter);

search() und searchEntries() unterscheiden sich nur im Rückgabewert. Einmal erhalten wir ein Zend_Ldap_Collection Objekt und einmal ein einfaches Array mit den Ergebnissen.

Damit sollten die oft gebrauchten Anwendungsfälle abgedeckt sein. Weitere Informationen gibt es natürlich im Manual des Zend Frameworks zu Zend_Ldap.

Written by Michael Kliewe

Januar 18th, 2010 at 5:02 pm

Posted in PHP

Tagged with , , ,