schneerunzel
Goto Top

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)

Content-Key: 263840

Url: https://administrator.de/contentid/263840

Printed on: April 23, 2024 at 13:04 o'clock

Mitglied: 114757
114757 Feb 18, 2015 at 16:08:59 (UTC)
Goto Top
Member: schneerunzel
schneerunzel Feb 18, 2015 at 16:19:17 (UTC)
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
Mitglied: 116830
116830 Feb 18, 2015 at 17:50:57 (UTC)
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;
}
Member: schneerunzel
schneerunzel Feb 18, 2015 at 18:12:26 (UTC)
Goto Top
ahhhhh?????
Mitglied: 116830
116830 Feb 18, 2015 updated at 20:34:27 (UTC)
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);
}
}
Member: schneerunzel
schneerunzel Feb 19, 2015 updated at 15:49:18 (UTC)
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?
Mitglied: 116830
Solution 116830 Feb 21, 2015, updated at Feb 23, 2015 at 18:07:14 (UTC)
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.