schneerunzel

PHP LDAP Login Gruppen Abfrage

Hallo Zusammen

ich habe dieses PHP Script:
if (isset($_POST['btnLogin'])){  
	//übergebene Daten speichern
	$username = $_POST['username'];  
	$password = $_POST['password'];  
	
	// Daten des LDAP-Servers
	$domain = 'ou=Users,dc=ldap,dc=fritz,dc=box';  
	$ldap_server = 'ldap.fritz.box';  
	
	// Mit dem LDAP-Server verbinden
	$ds = @ldap_connect($ldap_server);
	
	//Wenn Verbindung erfolgreich ...
	if ($ds){
		//Protokollversion festlegen
		ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
		
		//Versuche mit den übermittelten Credentials eine Verbindung
		if (@ldap_bind($ds,'uid='.$username.','.$domain,$password)){  
                        // Credentials OK, setze Session-Variablen
                        $_SESSION['login_state'] = true;  
                        $_SESSION['username'] = $username;  
                }else{
			// Credentials falsch
			$errormessage = "Login fehlgeschlagen!";  
		}
		ldap_close($ds);
	}else{
		echo "Fehler beim Verbinden mit dem LDAP-Server: ".ldap_error($ds);  
	}
}
Dieses Script stammt von einem anderen User aus diesem Forum

Unschwer zu erkennen ist das ich hiermit ein Login gegen LDAP prüfe

Ich würde gerne noch mit aufnehen das sich nur User einer bestimmten Gruppe anmelden dürfen und nicht alle wie es momentan der Fall ist.

Auf der PHP Seite (http://php.net/manual/de/ref.ldap.php) habe ich zwar was gefunden nur leider funktioniert das nicht, bzw wahrscheinlich bin ich nur zu dämlich dazu....

Könnt ihr mir helfen?

Ein paar Infos

ldif der Gruppe
# Suchbereich: base
# Suchfilter: (objectClass=*)
# Anzahl Einträge: 1
#
# Generated by LDAP Account Manager (http://www.ldap-account-manager.org) on February 18, 2015 3:44 pm
# Version: 4.4

version: 1

# Eintrag 1: cn=bdv,ou=Groups,dc=ldap,dc=fritz,dc=box
dn: cn=bdv,ou=Groups,dc=ldap,dc=fritz,dc=box
cn: bdv
description: bdv Group
gidnumber: 10021
memberuid: max
memberuid: lisa

Das ganze ist ein openLDAP (kein AD)
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 263840

Url: https://administrator.de/forum/php-ldap-login-gruppen-abfrage-263840.html

Ausgedruckt am: 29.04.2025 um 04:04 Uhr

114757
114757 18.02.2015 um 17:08:59 Uhr
Goto Top
schneerunzel
schneerunzel 18.02.2015 um 17:19:17 Uhr
Goto Top
Danke für die Antwort.

Da ich wirklich PHP Leihe bin blick ich da nicht durch. Diese Seite hatte ich auch son gefunden bin aber daran gescheiter
116830
116830 18.02.2015 um 18:50:57 Uhr
Goto Top
Ich nutze folgende PHP-Funktion in Kombination mit der Windows AD:

function ldap_ingroup($ldap, $user, $grp){
        $results = ldap_search($ldap, $GLOBALS['config']['login']['ldap']['base_dn'], '(samaccountname='.$user.')', array("memberof", "primarygroupid"));  
        $entries = ldap_get_entries($ldap, $results);
        if($entries['count'] == 0) return false;  
        array_shift($entries['memberof']);  
        $gruppen = $entries['memberof'];  
        foreach($gruppen as $gruppe){
                $gruppe = str_replace('CN=', '', $gruppe);  
                $gruppe = strstr($gruppe, ',', true);  
                if($gruppe == $grp){
                        return true;
                }
        }
        return false;
}
schneerunzel
schneerunzel 18.02.2015 um 19:12:26 Uhr
Goto Top
ahhhhh?????
116830
116830 18.02.2015 aktualisiert um 21:34:27 Uhr
Goto Top
Man könnte das ganze in etwa so umbauen. Ich konnte das Script allerdings nicht testen.

<code style="php">if (isset($_POST['btnLogin'])){
übergebene Daten speichern
$username = $_POST['username'];
$password = $_POST['password'];

Daten des LDAP-Servers
$domain = 'ou=Users,dc=ldap,dc=fritz,dc=box';
$ldap_server = 'ldap.fritz.box';
$ldap_gruppe_dn = 'cn=bdv,ou=Groups,dc=ldap,dc=fritz,dc=box';

Mit dem LDAP-Server verbinden
$ds = @ldap_connect($ldap_server);

Wenn Verbindung erfolgreich ...
if ($ds){
Protokollversion festlegen
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

Versuche mit den übermittelten Credentials eine Verbindung
if (@ldap_bind($ds,'uid='.$username.','.$domain,$password)){
ldap_search($ldap, $domain, '(uid='.$user.','.$domain.')', array("memberof", "primarygroupid"));
$entries = ldap_get_entries($ldap, $results);
if($entries['count'] == 0){
Nutzer nicht bei Suche gefunden
$errormessage = "Nutzer nicht gefunden!";
}else{
Nutzer bei der Suche gefunden + ersten Array Wert löschen (Ist die Anzahl der gefundenen Ergebnisse)
array_shift($entries['memberof']);
$in_gruppe = false;
Jede Gruppenmitgliedschaft mit der Gruppe von oben vergleichen und ggf. Variable setzen
foreach($entries['memberof'] as $gruppe){
if($gruppe == $ldap_gruppe_dn){
$in_gruppe = true;
}
}
Verarbeitung des Variablenwertes
if($in_gruppe == true){
Credentials OK, setze Session-Variablen
$_SESSION['login_state'] = true;
$_SESSION['username'] = $username;
}else{
$errormessage = "Nutzer nicht Mitglied der Gruppe!";
}
}

}else{
Credentials falsch
$errormessage = "Login fehlgeschlagen!";
}
ldap_close($ds);
}else{
echo "Fehler beim Verbinden mit dem LDAP-Server: ".ldap_error($ds);
}
}
schneerunzel
schneerunzel 19.02.2015 aktualisiert um 16:49:18 Uhr
Goto Top
Hallo,

vielen, vielen, vielen Dank für die Antwort!!!

mit ein paar Anpassungen komme ich dann auch ein ganze stück weiter...
Leider funktioniert es noch immer nicht. Es kommt die Meldung "Nutzer nicht Mitglied der Gruppe!"
Probiert habe ich es mit dem User max (siehe unten) und der Gruppe bdv (ebenfalls eine LDIF angehängt)

Seitens PHP habe ich noch:
Warning: array_shift() expects parameter 1 to be array, null given in /srv/bdv/ldap_login.php on line 28

Warning: Invalid argument supplied for foreach() in /srv/bdv/ldap_login.php on line 31
Die Zeilen sind an den Folgenden Text angepasst
if (isset($_POST['btnLogin'])){  
        //übergebene Daten speichern
        $username = $_POST['username'];  
        $password = $_POST['password'];  

        // Daten des LDAP-Servers
        $domain = 'ou=Users,dc=ldap,dc=fritz,dc=box';  
        $ldap_server = 'ldap.fritz.box';  
        $ldap_gruppe_dn = 'cn=bdv,ou=Groups,dc=ldap,dc=fritz,dc=box';  

        // Mit dem LDAP-Server verbinden
        $ds = @ldap_connect($ldap_server);

        //Wenn Verbindung erfolgreich ...
        if ($ds){
                //Protokollversion festlegen
                ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

                //Versuche mit den übermittelten Credentials eine Verbindung
                if (@ldap_bind($ds,'uid='.$username.','.$domain,$password)){  
                                                $results = ldap_search($ds,'dc=ldap,dc=fritz,dc=box', '(uid='.$username.')', array("memberof", "primarygroupid"));  
                                                $entries = ldap_get_entries($ds, $results);
                                                if($entries['count'] == 0){  
                                                        // Nutzer nicht bei Suche gefunden
                                                        $errormessage = "Nutzer nicht gefunden!";  
                                                }else{
                                                        // Nutzer bei der Suche gefunden + ersten Array Wert löschen (Ist die Anzahl der gefundenen Ergebnisse)
                                                        array_shift($entries['memberof']);  
                                                        $in_gruppe = false;
                                                        // Jede Gruppenmitgliedschaft mit der Gruppe von oben vergleichen und ggf. Variable setzen
                                                        foreach($entries['memberof'] as $gruppe){  
                                                                if($gruppe == $ldap_gruppe_dn){
                                                                        $in_gruppe = true;
                                        }
                                                        }
                                                        // Verarbeitung des Variablenwertes
                                                        if($in_gruppe == true){
                                                                // Credentials OK, setze Session-Variablen
                                        $_SESSION['login_state'] = true;  
                                        $_SESSION['username'] = $username;  
                                                        }else{
                                                                $errormessage = "Nutzer nicht Mitglied der Gruppe!";  
                                                        }
                                                }

                }else{
                        // Credentials falsch
                        $errormessage = "Login fehlgeschlagen!";  
                }
                ldap_close($ds);
        }else{
                echo "Fehler beim Verbinden mit dem LDAP-Server: ".ldap_error($ds);  
        }
}
# Eintrag 1: cn=bdv,ou=Groups,dc=ldap,dc=fritz,dc=box
dn: cn=bdv,ou=Groups,dc=ldap,dc=fritz,dc=box
cn: bdv
description: 
gidnumber: 10021
memberuid: jhansen
memberuid: bkopp
memberuid: hschmidt
memberuid: max
objectclass: posixGroup

# Eintrag 1: uid=max,ou=Users,dc=ldap,dc=fritz,dc=box
dn: uid=max,ou=Users,dc=ldap,dc=fritz,dc=box
cn: Max Mustermann
description: Testbenutzer
gidnumber: 513
givenname: Max
homedirectory: /home/max
loginshell: /bin/bash
objectclass: posixAccount
objectclass: inetOrgPerson
objectclass: organizationalPerson
objectclass: person
objectclass: top
sn: Mustermann1
st: Schleswig-Holstein
uid: max
uidnumber: 10019
userpassword: {SSHA}vxC9pp48FSoVlPlbyT6/SnpjsOl4ZXk5

Habt Ihr noch eine Idee?
116830
Lösung 116830 21.02.2015, aktualisiert am 23.02.2015 um 19:07:14 Uhr
Goto Top
Vermutlich passt der Filter in Zeile 21 nicht.

Wenn man die Variable '$entries' nach Zeile 22 ausgibt so kann man sich an den richtigen Wert für den Filter Parameter heran tasten. Sobald der Filter richtig gesetzt ist, werden alle Nutzergruppen, sowie die Anzahl aller Gruppenmitgliedschaften ausgegeben.