1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

per PHP gegen LDAP authentifizieren

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von NightMare, 28.08.06.

  1. NightMare

    NightMare Zuccalmaglios Renette

    Dabei seit:
    09.11.04
    Beiträge:
    263
    Hallo zusammen,
    ich würde gerne per php einen ldap-server anrufen und dann einen user daran authentifizieren... soviel ich ghört / gelesen habe sollte dies ohne probleme gehen... hat jemand schon ein script für das? :eek:

    gruss nightmare
     
  2. mcjojo

    mcjojo Morgenduft

    Dabei seit:
    18.02.06
    Beiträge:
    171
  3. NightMare

    NightMare Zuccalmaglios Renette

    Dabei seit:
    09.11.04
    Beiträge:
    263
    Super danke!
    Der untere Link hat mir sehr weitergeholfen...

    gruss nightmare
     
  4. NightMare

    NightMare Zuccalmaglios Renette

    Dabei seit:
    09.11.04
    Beiträge:
    263
    okay, ich habs probiert und probiert aber ich komme einfach nicht weiter.. :( ist jemand hier der mir weiterhelfen kann betreffend php und ldap? biiiiitte... bin am verzweifeln...

    thx&gruss nightmare
     
  5. csharp

    csharp Gast

    Wenn du dein Problem etwas genauer erklärst kann ich dir bestimmt helfen.
     
    NightMare gefällt das.
  6. NightMare

    NightMare Zuccalmaglios Renette

    Dabei seit:
    09.11.04
    Beiträge:
    263
    Juhuuuui! :-D
    Also, ich habe eine website und möchte dass sich die user am ldap-server identifizieren können. ich habe nun mit viel mühe das skript erstellt, sodass ich den user überprüfen kann (mit name und passwort). nun möchte ich aigentlich wissen noch wissen ob der user in der gruppe "Lehrteam" ist, so dass ich ihm dann gewisse funktionen erlauben kann / oder eben nicht...

    Mein Skript:
    Code:
    $ldap_server		= "ldap://10.72.6.242";
    								
    if($connect=ldap_connect($ldap_server)){ // if connected to ldap server
    					
    if (ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3)) {
    	echo "version 3<br>\n";
    } else {
    	echo "version 2<br>\n";
    }
    		   
    echo "verification on '$ldap_server': ";
    			
    $ldap_user		= "uid=jojo,cn=users,dc=serverinfo1,dc=local";
    $ldap_pw		= "xxx";
    		
    if(($ds=ldap_bind($connect, $ldap_user, $ldap_pw)) == false){
    	print "bind:__FAILED__<br>\n";
          return false;
    }
    else{
    	print "GRANTED";
    }
    }
    echo "<br><br>";
    

    danke für deine angebotene hilfe!
    gruss nightmare
     
  7. NightMare

    NightMare Zuccalmaglios Renette

    Dabei seit:
    09.11.04
    Beiträge:
    263
    wow, das sieht recht heavy aus... und habe nur die hälfte verstanden... srry.. :-[
    gibt es keinen einfachen befehl um diese anforderung kurz zu prüfen? o_O

    gruss nightmare
     
  8. csharp

    csharp Gast

    Out of the box ist mir keine Methode ismemberOf oder dergestalt bekannt.
    Selbst coden, oder noch besser mal in PEAR suchen, habe auf Anhieb das hier gefunden:

    http://pear.php.net/package/Net_LDAP

    Wobei ich diese Klasse nicht kenne, scheint aber der Beschreibung nach das zu sein was du suchst.
     
  9. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Gibt es einen Grund warum Du das nicht den Webserver machen läßt?
     
  10. NightMare

    NightMare Zuccalmaglios Renette

    Dabei seit:
    09.11.04
    Beiträge:
    263
    Na das is ja super... :-D

    Herzlichen Dank! :-* Das hilft mir mal wirklich weiter...
    Werde aber wohl zu gegebener Zeit selber was coden...

    gruss nightmare
     
  11. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Schlecht, posixAccount sollte man nicht für Webauftritte verlangen. inetOrgPerson ist besser geeignet, da es nicht so spezielle Anforderungen stellt wie dies posixAccount tut.
     
  12. NightMare

    NightMare Zuccalmaglios Renette

    Dabei seit:
    09.11.04
    Beiträge:
    263
    öhm, wie soll das gehen? der user ruft die seite auf und hat ein login-fenster.. er gibt seine angaben an und wird dann identifiziert und kann nun gewisse einstellungen an der homepage vornehmen.. wüsste nicht wie das anderst gehen soll?! bin aber offen für infos... ;)

    gruss nightmare
     
  13. mcjojo

    mcjojo Morgenduft

    Dabei seit:
    18.02.06
    Beiträge:
    171
    Zum Auslesen beliebiger Daten aus dem LDAP dient die Funktion ldap_search:
    http://de3.php.net/manual/de/function.ldap-search.php

    Damit könntest die Mitglieder der Gruppe "Lehrteam" auslesen und dann vergleichen, ob der User in der Zurückgegebenen Liste enthalten ist.
     
  14. NightMare

    NightMare Zuccalmaglios Renette

    Dabei seit:
    09.11.04
    Beiträge:
    263
    jop diese funktion habe ich auchschon gefunden und habe mir dn und so weiter ausgeben lassen... wenn du mir etzt sagen kannst mit welchem param ich die gruppen auslesen kann würde ich dir am liebsten um den hals fallen... :-D

    gruss nightmare

    die suche sieht zur Zeit so aus:
    Code:
    $person	= "jojo";
    			
    $dn 		= "dc=serverinfo1,dc=local";
    $filter		="(|(sn=$person*)(vorname=$person*))";
    $justthese 	= array( "ou", "sn", "vorname", "dn");
    							
    $sr			= ldap_search($connect, $dn, $filter, $justthese);
    								
    $info 		= ldap_get_entries($connect, $sr);
    								
    print $info["count"]." gefundene Einträge<p>"; 
     
  15. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Das Auth Modul für apache verwenden und die Webseiten und/oder die virtuelle Website gegen LDAP authentifizieren. In PHP sind dann die Nutzer bereits authentifiziert. Das ist das übliche Vorgehen, wenn man komplette Seiten blocken will, weil es keine PHP-Angriffe auf den Code der Webseite möglich sind. Was Du letztlich verwendest hängt davon ab, was Du tun willst.
     
  16. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Nein, nein so macht man das nicht!

    Für Benutzeraccounts gibt es das attribut "uid", damit das funktioniert müssen Einträge von Typ inetOrPerson oder davon abgeleiteter Klassen sein. Mehrfachvererbung durch hinzufügen weiterer Klassen ist möglich.

    Wenn Du Personen in einer Gruppe zusammenfassen willst nimmst in diesem Fall am besten "GroupOfUniqueNames". GroupOfUniqueNames verlangt, daß es mindestens ein Mitglied gibt, d.h. uniqueMember='ldap_dn_einfügen'.

    Beispiel
    Code:
    dc=de
      dc=apfeltalk
        cn=MyGroup
         |uniqueMember:'uid=foo,ou=user,dc=apfeltalk,dc=de'
      ou=user
         uid=foo
         |objectClass:top
         |objectClass:person
         |objectClass:inetOrgPerson
         |uid:foo
         | ...
    
    Der passende Suchfilter
    &(objectClass=inetOrgPerson)(uid='uid_string')
    oder
    &(objectClass=*)(uid='uid_string')

    Du bindest zum Suchen an den LDAP-Server an dem Punkt an, ab den Du im DIT suchen willst. Nicht vergessen SUBTREE als Suchbefehl, nur wenn Du wirklich weißt, das es keinen SUBTREE gibt kannst Du nur auf einem bestimmten Knoten im Baum suchen.
     
  17. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Bleibt noch zu ergänzen, daß man zum Überprüfen eines Accounts auf einem LDAP-Server sinnigerweise mit den Credentials des Nutzer auf den LDAP-Server sich verbindet.

    Du sucht mit der vorher beschrieben Methode den passenden dn zur vorgegebenen uid (schlägt die Suche fehl, dann gibt es gar keinen Nutzer), dann verbindest Du Dich mit der dn und dem Passwort auf den LDAP-Server, schlägt die Verbindung fehl, dann ist das Passwort falsch.

    Die Methode funktioniert immer, weil für einen normalen Nutzer es auf einem LDAP-Server nicht unbedingt erlaubt ist sein eigenes Passwort auszulesen, aber man kann sich gegen den LDAP-Server authentifizieren.
     
  18. mcjojo

    mcjojo Morgenduft

    Dabei seit:
    18.02.06
    Beiträge:
    171
    Ich kenne mich mit PHP nicht so aus, aber grob sollte es ungefähr so gehen:
    Also angenommen, Du hast eine Gruppe "cn=Lehrteam,ou=Group,dc=apfeltalk,dc=de",
    dann sollten die Mitglieder im Multivaluefeld "uniqueMember" stehen (siehe Post von tjp)

    Dann holst Du Dir mit ldap_search die Gruppe

    Code:
    $dn 		= "ou=Group,dc=apfeltalk,dc=de";
    $filter		="(cn=Lehrteam)";
    $justthese 	= array( "uniqueMember");
    							
    $sr			= ldap_search($connect, $dn, $filter, $justthese);
    
    Dann kannst Du mit ldap_first_entry über das ergebnis laufen bzw. wenn man so gezielt sucht, sollte es ja nur einen Treffer geben. Mit ldap_get_values kann man dann die Werte aus dem MultiValue-Feld lesen

    Code:
    $entry = ldap_first_entry($ds, $sr);
    $values = ldap_get_values($ds, $entry, "uniqueMember");
    
    Dann hast Du in $values eine Liste mit den Mitgliedern der Gruppe in der Form
    'uid=foo,ou=user,dc=apfeltalk,dc=de'
    'uid=foo2,ou=user,dc=apfeltalk,dc=de'
    ... etc.

    In dieser Liste suchst Du dann nach der gewünschten UID des Users
     
  19. NightMare

    NightMare Zuccalmaglios Renette

    Dabei seit:
    09.11.04
    Beiträge:
    263
    wow das is ne krasse antwort... :)
    genau sowas hab ich mir gewünscht! nur leider erhalte ich diese Ausgabe:
    Warning: ldap_get_values(): Cannot get the value(s) of attribute Decoding error in

    Ich wüsste aber nicht was ich no ändern könnte... Ich habe deine Suchfunktion auchschon mit meiner gepaart versucht... Dabei zeigt er mir schön an, dass es die Gruppe "Lehrteam" gibt und den dn dazu auch... Nur keine uniqueMember.. :eek: die spuckt er irgendwie nicht aus...

    gruss nightmare
     

Diese Seite empfehlen