Söka i LDAP (Open Directory) via PHP

Tråden skapades och har fått 18 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Lund
  • 2008-02-13 10:17

Är det någon som har lite fungerande exempel att dela med sig av för att hämta information ur Open Directory och visa på en webbsida?

Jag kan i princip inte ett skvatt php, och jag är inte så vass på ldap heller driekt om man säger så. O:-)

Jag har iaf hittat lite saker på nätet och kommit så långt att jag har kontakt med servern och den hittar poster. Men jag har verkligen ingen aning hur jag ska kunna göra något vettigt urval, och hur jag ska få det att visas på ett vettigt sätt. Att läsa manualen på php.net hjälper inte mig.

Är det någon här som använder sig av något dylikt?

  • Medlem
  • Uppsala
  • 2008-02-13 12:38

Jag har gjort lite smågrejer med detta, t.ex. gjort en intern telefon/mail lista för företagets intranät. Använder även php/LDAP för autentisering mot nämda intranät.

  • Medlem
  • Lund
  • 2008-02-13 13:20

Kan du dela med dig av någon del av koden du använder för att plocka ut infon?

Det här är bara ett litet "hobbyprojekt" som jag håller på med när jag inte har några andra jobb att göra. Det är inget som vi egentligen behöver, men jag tänkte att det kunde vara lite kul.

  • Medlem
  • Uppsala
  • 2008-02-13 13:48
// specify the LDAP server to connect to
$conn = ldap_connect("min.server.se") or die("Could not connect to server");
ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);

// bind to the LDAP server specified above
$r = ldap_bind($conn) or die("Could not bind to server");
//Find all people with mail addresses @server.*
$query = "(&(mail=*@server*)";
//Filter by specific departement
if ($_GET['avdelning'] && $_GET['avdelning'] != 'Alla')
$query .= "(departmentNumber=" . $_GET['avdelning'] . ")";
$query .= ")";
// start searching
// specify both the start location and the search criteria
// in this case, start at the top and return all entries
$result = ldap_search($conn,"dc=min,dc=server,dc=se", $query) or die("Error in search query");
// get entry data as array
$info = ldap_get_entries($conn, $result);
ldap_close($conn);

Då har du alla matchande objekt i $info, som du sen kan göra vad du vill med. Använd print_r($info) för att visa hur den är uppbyggd.

hth,
anders

  • Medlem
  • Uppsala
  • 2008-02-13 13:49
for ($i=0; $i<$info["count"]; $i++)
{
	if ($i % 2 == 0)
		echo "<tr class=\"even_row\" height=\"20\">";
	else
		echo "<tr class=\"odd_row\" height=\"20\">";
	if (strcmp($info[$i]["uid"][0], $uid) == 0){
		echo "<td><img src=\"/images/NewPerson.png\" width=\"16\" height=\"16\"></td>";
		echo "<td><i>".$info[$i]["givenname"][0]."</i></td>";
		echo "<td><i>".$info[$i]["sn"][0]."</i></td>";
		echo "<td><i><a href=\"mailto:".$info[$i]["mail"][0]."\">".$info[$i]["mail"][0]."</a></i></td>";
		echo "<td><i>".$info[$i]["telephonenumber"][0]."</i></td>";
		echo "<td><i>".$info[$i]["mobile"][0]."</i></td>";
		echo "<td align=\"right\"><i>".$info[$i]["pager"][0]."</i></td>";
	}
	else
	{
		echo "<td><img src=\"/images/vcard.png\" width=\"16\" height=\"16\"></td>";
		echo "<td>".$info[$i]["givenname"][0]."</td>";
		echo "<td>".$info[$i]["sn"][0]."</td>";
		echo "<td><a href=\"mailto:".$info[$i]["mail"][0]."\">".$info[$i]["mail"][0]."</a></td>";
		echo "<td>".$info[$i]["telephonenumber"][0]."</td>";
		echo "<td>".$info[$i]["mobile"][0]."</td>";
		echo "<td align=\"right\">".$info[$i]["pager"][0]."</td>";
	}
	$allEmails = $allEmails.$info[$i]["mail"][0].",";
	echo "</tr>\r\n";
}
  • Medlem
  • Lund
  • 2008-02-13 14:03

Tack! Nu kom jag ett stort kliv längre!

  • Medlem
  • Lund
  • 2008-02-13 20:08

Jag försökte trixa lite så att man kunde sortera resultatlistan på efternamn, men det gick inget vidare.

Har vi några förslag här?

  • Medlem
  • Uppsala
  • 2008-02-13 20:28

Tog givetvis bort det från ovanstående kodsnuttar... sorry.

// Sort Data by Company, Last Name and First Name
$attribs = array('givenname', 'sn');

if ($_GET['sort'] == "efternamn"){
        $attribs = array('sn', 'givenname');
}
else if ($_GET['sort'] == "telefon"){
        $attribs = array('telephonenumber','sn', 'givenname');
}
else if ($_GET['sort'] == "mobile"){
        $attribs = array('mobile','sn', 'givenname');
}
else if ($_GET['sort'] == "anknytning"){
        $attribs = array('pager','sn');
}
else if ($_GET['sort'] == "e-post"){
        $attribs = array('mail','sn', 'givenname');
}

for ($i=0; $i<$info["count"]; $i++)
{
        $index = $info[$i];
        $j=$i;
        do {
                //create comparison variables from attributes:
                $a = $b = null;
                foreach($attribs as $attrib){  
                        $a .= $info[$j-1][$attrib][0];
                        $b .= $index[$attrib][0];
                }
                // do the comparison
                if ($a > $b){
                        $is_greater = true;
                        $info[$j] = $info[$j-1];
                        $j = $j-1;
                }else{
                        $is_greater = false;
                } 
        } while ($j>0 && $is_greater);
        
        $info[$j] = $index;
}
  • Medlem
  • Lund
  • 2008-02-14 10:37

Verkligen superschysst!

Tyvärr är jag ju som jag skrev total n00b på php. Jag fattar inte riktigt hur jag väljer sortering. Nu går den på förnamn.

Sen har jag lite problem med sökkriterierna. I ditt exempel används mail som sökkriterium. Det funkar att byta till namn, telefonnummer och några till. Men långt ifrån alla attribut funkar. Jag trodde att alla "native attributes" skulle funka, men icke. Är det jag som gör något fel, eller beror det på andra begränsningar?

  • Medlem
  • Uppsala
  • 2008-02-14 10:43

Vad gäller sortering, så är det $attributes-arrayen som säger vilka fält och ordning som den ska sorteras i. $attribs = array('mail','sn', 'givenname'); sorterar sålunda först på e-post adress, följt av efternamn, följt av förnamn.

Vad gäller andra attribut, så borde väl det fungera med alla som finns i LDAP-katalogen. Använd LDapper (sök på Google) och browsa din LDAP-domän och kolla vad de olika attributen heter och var de ligger. Kan det vara fel sökväg annars?

  • Medlem
  • Lund
  • 2008-02-14 11:22

Tack igen. Det som förvirrar mig lite med sorteringen är det här $_GET['sort']-grejen. Det behövs ju inte om man styr sorteringen med raden ovanför. Är det något som används för att sortera om på begäran?

Jag använder WGM för att browsa databasen och den visar all info man kan tänkas behöva.

Mitt problem är att jag vill sortera ut en viss grupp, men det verkar visst inte gå så bra. Den söker inte på grupper, och grupptillhörigheterna syns inte i på user-nivå.

  • Medlem
  • Uppsala
  • 2008-02-14 11:33

$_GET är en PHP-variabel som innehåller de argument som skickas till scriptet i adressfältet (tex. index.php?sort=mail).

Du kan få fram gruppens medlemmar genom att göra följande sökning:

$query = "(&(cn=$groupname))";
$result = ldap_search($conn,"cn=groups,dc=din,dc=server,dc=se", $query) or die("Error in search query");
$info = ldap_get_entries($conn, $result);
  • Medlem
  • Lund
  • 2008-02-14 17:17

Det går inte jättebra för mig.

På det viset kan jag få fram en array som innehåller kortnamnen på alla i gruppen, men jag vill ju ha en lista, som i första exemplet, men namn och telefon etc. Men begränsat till endast den gruppen.

  • Medlem
  • Uppsala
  • 2008-02-14 17:29

Du får ju fram alla personers cn i den gruppen då, och den kan du i sin tur använda till att söka fram info för dem.

  • Medlem
  • Uppsala
  • 2008-02-14 17:31

När jag nu tänker på saken går det kanske att få fram allt på en gång. Återkommer imorgon när jag är på jobbet igen.

  • Medlem
  • Lund
  • 2008-02-22 08:22
Ursprungligen av waehlby:

När jag nu tänker på saken går det kanske att få fram allt på en gång. Återkommer imorgon när jag är på jobbet igen.

Vi gör ett nytt försök nästa vecka kanske?

  • Medlem
  • Uppsala
  • 2008-02-22 08:24

Sorry, glömde bort det här. Jag kollade, och hittade dessvärre inget bättre sätt än att göra två queries.

  • Medlem
  • Lund
  • 2008-02-22 08:29

Aha, okej. Too bad, men tack ändå.

  • Medlem
  • Lund
  • 2008-02-27 16:32

Om du (waehlby) eller någon annan har tid, lust och kunskap att knåpa ihop något för att göra en lista enligt det ursprungliga scriptet ovan, men där man kan ha urvalskriterier, såsom grupp t.ex. så skulle jag bli väldigt glad.

Som jag har skrivit tidigare är det bara ett hobbyprojekt jag har, och jag kan tyvärr inte php, så det blir lite handikappat. Jag har dock full förståelse om ingen känner att de vill lägga tid på det här hur som helst.

1
Bevaka tråden