WEB címjegyzék létrehozása PHP + LDAP

Eljött az idő, amikor egy (relatíve) nagy cégnél sok távoli iroda működött, ahol jelentős számú felhasználó volt. Minden iroda egy hálózatba van csatlakoztatva egy közös domain alatt, minden irodát az Active Directory (a továbbiakban AD) rendszerében Organization Unit (OU) néven határoztak meg, ahol már fel voltak véve a felhasználók.

Le kellett adni a felhasználóknak a lehetőséget, hogy gyorsan és különösebb erőfeszítés nélkül elérhessék a szükséges kolléga elérhetőségi adatait az AD-ból, miközben a rendszergazdákat meg kellett szabadítani a szövegfájl szerkesztésének rutinfeladatától, amely címjegyzékként funkcionált.

Nem találtunk megfelelő megoldásokat a feladat megoldására, ezért mindent saját kezűleg és fejjel kellett megoldanunk.

Kezdjük azzal, hogy először is döntsük el, mit használjunk; ez egyszerű – a végső címtárnak minden domain felhasználó számára elérhetőnek kell lennie böngészőn keresztül. Az első, ami eszembe jutott, az a PHP LDAP-pel való párosítása, ezt fogjuk használni. A PHP használatának nagy előnyének tartom viszonylagos egyszerűségét – bármely kicsit is értő rendszergazda képes lesz szükség esetén módosítani a kódot, különösebb erőfeszítés nélkül.

Tehát kezdjük. Először is állítsuk be a domainhez való csatlakozás paramétereit:

$srv ="SERVER";
$srv_domain ="DOMAIN.COM";
$srv_login ="USERNAME@".$srv_domain; 
$srv_password ="PASSWORD";

A következő lépésben meg kell határoznunk, melyik OU-t keressük a felhasználók számára. Ezt az $_GET[‘place’] értékének elfogásával fogjuk megvalósítani. Például, ha a felhasználó a címre navigál: server/index.php?place=first, akkor a változó $place értéke a következő lesz: first.

$place = (@$_GET['place']);
$doscript=true;
switch($place){ 
case "first" :
	$dn ="OU=ou1,OU=DOMAIN,dc=DOMAIN,dc=COM";			
	break;
case "second":
	$dn ="OU=ou2,OU=DOMAIN,dc=DOMAIN,dc=COM";			
	break;
	//itt további feltételeket is hozzáadhatunk.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Változó $doscript az arra szolgál, hogy tárolja az értéket – meghatároztuk-e az OU-t, amelyben a felhasználókat keresni fogjuk, vagy sem. Ha nem találunk egyet sem a „switch-case” listájában, akkor $doscript=false értékre áll, a szkript fő része nem fog végrehajtódni, hanem a „main_table.html” kezdőlap jelenik meg (erről a végén mesélek).

Ha meghatároztuk az OU-t, akkor folytatjuk a további lépéseket: elkezdünk egy címtár oldalt rajzolni a felhasználónak:

más ha ($doscript) {
{echo "
<!DOCTYPE html> 
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<link rel='shortcut icon' href='ico.png'>
<meta charset='windows-1251/ '>

Aktiváljuk a stílusokat a kellemesebb megjelenés érdekében (igen, csatolhattuk volna őket css-fájlként, de néhány IE verzió nem az így megadott stílusokat fogadja el, ezért közvetlenül a szkriptbe kell írni):

*{text-align: center; font-family:tahoma; font-size:14px;}
	a{text-decoration: none; color: #000;}
	a:hover{text-decoration: underline; color: #0059FF;}
	#bold{text-decoration: none; font-weight: 600;font-size:20px;}
	#table,tr,td{border-style:solid;border-width:1px; border-collapse:collapse;padding:5px; height:22px;border-color:#7d7d7d;}
	/* Páratlan sorok */ #table tbody tr:nth-child(odd){background: #fff;}
	/* Páros sorok */ #table tbody tr:nth-child(even){background: #F7F7F7;}
	#noborder{border-width: 0 px; border-style: none;}
	#sp30px{text-indent: 30px;text-align: justify;}
	#smallsize{font-family:tahoma; text-indent: 5px; text-align:left; font-size:12px;}
	#top {background: #ffffff;
		text-align: center;
		left:0;
		top:0px;
		table-layout: fixed;
		border-style:solid;
		border-width:0px;
		border-collapse:collapse;
		padding:0px;
		height:22px;
		border: 0px;
		z-index: 99999;
		display:block;
		width:80px;
		opacity: 0.6;
		filter: alpha(Opacity=60);
		height:100%;
		position:fixed;}
	#top:hover{background: #afafaf;opacity: 100;filter: alpha(Opacity=100);text-decoration: none;color: #000000;}
	.smalltext{padding-top: 1px;
		padding-bottom: 1px;
		text-align: bottom;
		font-family:tahoma;
		color: #a0a0a0;
		line-height: 7px;
		font-size: 10px;}
	.smalltext:hover{color: #0000ff;}
	.transition-rotate {position: relative;
		z-index: 2;
		margin: 0 auto;
		padding: 5px;
		text-align: center;
		max-width: 500px;
		cursor: pointer;
		transition: 0.1s linear;}
	.transition-rotate:hover {-webkit-transform: rotate(-2deg);	transform: rotate(-2deg);}
	#lineheight{
		text-align: left;
		line-height: 1px;
		text-decoration: none;
		font-weight: 600;
		font-size:20px;}

A stílusokkal végeztünk, most beállítjuk a lap címét, és megrajzoljuk a kényelmes visszatérő linket a főoldalra:

<title>«YourMegaCompanyName» címtár</title>	
</head>
<body style='background-color:#ffffff;'>";
}
echo "
<table id='top'><tr><td id='top'>
<a href='index.php?place=main' id='top' >
<br><br><br>
<img src='back_to_main.png' alt='' border='0' width='75' height='60'/>
<p>Vissza a főoldalra</p></a>
</td></tr></table>
";

Kijelöljük a keresési szűrőket az AD-ban, és lekérjük az OU adatokat:

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; // minden felhasználó, kivéve a letiltottakat.
$filter2 ="(objectCategory=OrganizationalUnit)"; // az OU információk lekéréséhez
$ds=ldap_connect($srv); 
if ($ds) { 
    $r=ldap_bind($ds,$srv_login,$srv_password);;
	ldap_set_option($ds,LDAP_OPT_REFERRALS, 0);
	ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
	$sr=ldap_search($ds,$dn ,$filter ); 
    ldap_sort($ds,$sr, "givenname");
    $info = ldap_get_entries($ds, $sr); 
    $sr2=ldap_search($ds,$dn ,$filter2 ); 
    $placeinfo = ldap_get_entries($ds, $sr2); 
$PlaceName = $placeinfo[0]["l"][0]; 			// a hely neve
$PlaceAddres = $placeinfo[0]["street"][0];		// a hely címe
$PlaceMail = $placeinfo[0]["description"][0]; 	// a hely e-mail címe
$PlacePhone = $placeinfo[0]["st"][0]; 		// a hely telefonszáma

Folytatjuk az oldal felső részének formázását:

echo"<table align='center' height = '80'>
	<td id='noborder' ><div id='lineheight'>". $PlaceName ."</div></td></tr>
	<tr><td id='noborder' >". $PlaceAddres ."</td></tr>
    </table>
<table align='center' id='table'>
	<tr><td width='35' bgcolor = "#f0f0e4">  № </td>
	<td width='300' bgcolor = "#f0f0e4"> Név </td>
	<td width='250' bgcolor = "#f0f0e4"> E-mail </td>
	<td width='60' bgcolor = "#f0f0e4"> Telefon </td>
	<td width='150' bgcolor = "#f0f0e4"> Mobile </td></tr>
	<tr><td></td><td> OU adatok </td><td>";
echo "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";

Ezután ciklusban lekérjük és feldolgozzuk a felhasználói adatokat, miközben néhány (például adminisztratív) fiókot elrejtünk, csak annyit jegyzünk fel, hogy a felhasználói adatokban az 'hide' kerüljön a 'room' mezőbe, ezek a felhasználók nem fognak megjelenni a könyvtárban:

for ($i=0; $i<$info["count"];$i++) { 
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0];                //Felhasználó neve
$UserPosition = $info[$i]["title"][0]; 		//Beosztás
$UserMail = $info[$i]["mail"][0];			//e-mail
if (!$UserMail)) $UserMail = "-";                  //ha nincsenek adatok az AD-ben, akkor egy vonalat mutatunk
$UserIpPhone = $info[$i]["ipphone"][0];		//IP telefon
	if (!$UserIpPhone) $UserIpPhone = "-";    //ha nincsenek adatok az AD-ben, akkor egy vonalat mutatunk
$UserMobile = $info[$i]["mobile"][0];		//mobil
	if (!$UserMobile) $UserMobile = "-";     //ha nincsenek adatok az AD-ben, akkor egy vonalat mutatunk

Egyébként, ha más attribútum értékét szeretné megkapni, ne felejtsd el (ez fontos):
az igénylésben átadjuk az attribútum nevét kisbetűs betűkkel, különben nem fog működni.

És az így kapott adatokat beillesztjük a táblázatba:

    echo "<tr>
	<td>". $n+=1 ."</td>
	<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Felhasználónév és pozíció 
	if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail  </a></div>";    // ha a felhasználónak van e-mail címe, létrehozunk egy hivatkozást az e-mail küldésére
	else echo "-"; // ha nincs e-mail, kötőjel kerül a helyére.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Ezután lezárjuk a ldap kapcsolatot, vagy üzenetet adunk arról, hogy lehetetlen a szerverhez való csatlakozás:

ldap_close($ds); 
} 
else echo "<h4>Nem sikerült csatlakozni az LDAP szerverhez</h4>"; 
echo '<br><br><br></body></html>';}

A "main_table.html" fájl belsejében egy egyszerű HTML oldal található linkekkel, és körülbelül így néz ki:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>«YourMegaCompanyName» címtár</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Helyiségek és irodák</b></center>
<br>
<table border="0" width="450" bgcolor="#dddddd" align="center" valign="middle" cellspacing="0">

<tr id="space"><td></td></tr>
<tr><td align="left" id="abz"><a href="index.php?place=ou1">OU1</a></td></tr>
<tr id="space"><td></td></tr>
<tr><td align="left" id="abz"><a href="index.php?place=ou2">OU2</a></td></tr>

</table></body></html>

Ha valakinek segít a kód, örömmel látom, használjátok!

Azt is szabadon szerkeszthetitek, ahogy akarjátok (javítani/rosszítani) és terjeszthetitek bármilyen módon.

Köszönöm a figyelmet!

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster