LDAP Verbindung mit PHP

PHP bietet eine robuste LDAP Integration. LDAP kann man nutzen um eine Interaktion mit einem zentralen Verzeichnisdienst zu führen. Das kann sein z.B. sucht man einen Kontakt innerhalb eines Adressbuch oder man möchte eine Authentifizierung an einem Benutzerkonto durchführen.

Um LDAP mit PHP nutzen zu können muss entweder LDAP bereits ins PHP kompiliert sein oder man muss die LDAP Erweiterung einbinden. Ob LDAP aus dem PHP Server zur Verfügung steht kann man über die PHP Funktion phpinfo herrausfinden. Wenn LDAP zur Verfügung steht sieht man auf der phpinfo Seite das hier:

php info

Wenn man die Vorarbeiten erledigt hat, kann man versuchen über PHP auf einen LDAP Server zu zugreifen. Hierzu muss man im ersten Schritt eine Verbindung mit der Funktion ldap_connect aufbauen. Im zweiten Schritt kann/muss man sich am LDAP Server authentifizieren. Jenachdem wie der LDAP Server eingestellt ist, muss man sich ggf. nicht authentifizieren. Bei LDAP nennt man den Authentifizierungsvorgang Binding und hierfür gibt es die Funktion ldap_bind.

In der folgenden PHP Funktion werden ldap_connect und ldap_bind nacheinander durchführt und wenn das Binding erfolgreich war, gibt die PHP Funktion ein Array mit dem Verarbeitungsstatus und eine Verbindungsressource zum LDAP Server zurück. Mit dieser Verbindungsressource kann man dann Operationen wie z.B. ldap_search ausführen.

function ldap_connect_bind($ldapVD, $ldapProtocol, $ldapServer, $ldapPort, $authUser, $authPass, $logLevel) {
 
	/*
	to use this function poperly include the following extensions in php.ini
	extension=php_openssl.dll/so
	extension=php_ldap.dll/so
 
	if they're not compiled in the php layer!
 
	for the use of this function you need to set the following vars:
 
	$ldapVD = eDIR, AD, LDAP
	$ldapProtocol = ldap or ldaps
	$ldapServer = ip or dns 
	$ldapPort = 389 or 636
	$authUser = set full qualified dn like cn=administrator, ou=system
	$authPass = clear text password for the authUser
	$logLevel = 0 - 7 is logging to server error.log 
 
	this function returns an array: 
	first node [0] is the returncode:
 
		0 = success
		on success the second node [1] contains the binding handle
 
		1 = error
		on error the secode node is filled.
 
	secode node [1] is the error description or the binding handle
 
	the following option skips the validationcheck of the server certificate 
	some version of openSSL suck, if causeing error parsing the cert still, do this:
	make a file here: C:\OpenLDAP\sysconf\ldap.conf
	and write in TLS_REQCERT never
	that should solve the problem at last */
	putenv('LDAPTLS_REQCERT=never');
 
	/*
	set some ldap logging options for debugging 
	if will log straight in to the server error.log file */
	if (!empty($logLevel)){
	  ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, $logLevel);
	}
 
	// try to connect to ldap without auth
	if (!($con = @ldap_connect($ldapProtocol.'://'.$ldapServer, $ldapPort))) {
		return array(1, "no connection to " . $ldapProtocol.'://' . $ldapServer . ':' . $ldapPort);
		exit;
	}
 
	// if connection can be established, setting the VD special options
	switch($ldapVD){
		case 'AD':
			ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
			ldap_set_option($con, LDAP_OPT_REFERRALS, 0);
			break;
		case 'eDIR':
			break;
		case 'LDAP':
			break;	
	}
 
	// try to bind on the user 
	if (!($bind=@ldap_bind($con, $authUser , $authPass))) {
		return array(1,"authentication with ".$authUser." failed");
		exit;
	}else{
		return array(0,$con);
		exit;
	}
}

Bei einigen Verzeichnisdiensten muss man dedizierte Optionen für den Verbindungsaufbau in der Laufzeit konfigurieren. Ich habe das PHP Skript gegen Actve Directory, eDirectory und OpenLDAP ausprobiert. Bisher habe ich nur beim Active Directory festgestellt, dass man aktiv die Optionen LDAP_OPT_PROTOCOL_VERSION  und LDAP_OPT_REFERRALS setzen muss. Die anderen beiden Verzeichnisdienste haben beim Verbindungsaufbau keine Optionen benötigt. Eine Liste aller LDAP Optionen findet man bei der Erläuterung zur Funktion ldap_set_option

Bitte beachtet, die PHP Funktion ignoriert bei LDAPS die Überprüfung des Zertifikates. D.h. seit euch sicher ob ihr diese nicht „vertrauenswürdige Verbindung“ mit dem LDAP Server eingehen wollt. Falls das zu heikel ist, dann müsst ihr im Vorfeld das Zertifikat des LDAP Servers auf dem PHP Server importieren. Hierfür schreibe ich vielleicht mal später eine Anleitung 😉

http://www.agile-coding.net/ldap-verbindung-mit-php/