WEB adresų katalogo kūrimas PHP + LDAP

Taip atsitiko, kad (palyginti) didelė kampanija turėjo daug nuotolinių biurų su tinkamu vartotojų skaičiumi. Visi biurai sujungti į vieną tinklą su bendru domenu, kiekvienas biuras Active Directory (toliau – AD) buvo apibrėžtas kaip organizacijos padalinys (OU), kuriame jau buvo sukurti vartotojai.

Reikėjo suteikti vartotojams galimybę greitai ir be vargo gauti reikiamo darbuotojo kontaktinę informaciją iš AD, o sistemos administratorius atlaisvinti nuo adresų knygos vaidmenį atlikusio tekstinio failo redagavimo rutinos.

Nebuvo paruoštų tinkamų variantų, kaip išspręsti problemą, todėl turėjau viską daryti savo rankomis ir galva.

Pradėkime nuo to, kad pirmiausia reikia nuspręsti, ką naudoti, tai paprasta – galutinis katalogas turi būti pasiekiamas visiems domeno vartotojams per naršyklę. Pirmas dalykas, kuris ateina į galvą, yra PHP kartu su ldap, ir mes juos naudosime. Didžiuliu PHP naudojimo privalumu laikau santykinį paprastumą – bet kuris nors šiek tiek išmanantis sistemos administratorius prireikus galės atlikti reikiamus kodo pakeitimus, ypatingai neįsitempdamas.

Taigi, pradėkime. Pirmiausia nustatykime prisijungimo prie domeno parametrus:

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

Kitas dalykas yra nustatyti, kurioje OU ieškosime vartotojų. Tai padarysime perimdami reikšmes iš $_GET['vieta']. Pavyzdžiui, jei vartotojas eina adresu serveris/index.php?place=pirmas, tada kintamasis $ vieta bus priskirta vertė pirmas.

$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;
	//здесь можно добавить ещё условий.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Kintamas $doscript reikalinga reikšmei išsaugoti – nesvarbu, ar apibrėžėme OU, kurioje ieškosime vartotojų, ar ne. Jei „switch-case“ sąraše nėra atitikmenų, tada $doscript=false, pagrindinė scenarijaus dalis nebus vykdoma ir bus rodomas pradžios puslapis „main_table.html“ (papasakosiu apie tai pačioje pabaigoje).

Jei apibrėžėme OU, pereiname prie tolesnių veiksmų: pradedame piešti vartotojo katalogo puslapį:

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

Įtraukiame stilių, kad išvaizda būtų malonesnė (taip, jie gali būti įtraukti kaip css failas, tačiau kai kurios IE versijos nenori priimti tokiu būdu nustatytų stilių, todėl turite juos įrašyti tiesiai į scenarijų):

<style>
	*{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;}
	/* Нечетные строки */#table tbody tr:nth-child(odd){background: #fff;}
	/* Четные строки */   #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;}
</style>

Baigėme su stiliais, dabar parašome skirtuko pavadinimą ir nupiešiame patogią nuorodą, kad grįžtume į pagrindinį puslapį:

<title>Adressbook of «YourMegaCompanyName»</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>На главную</p></a>
</td></tr></table>
";

Pagal AD apibrėžiame paieškos filtrus ir gauname duomenis apie OU:

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; //все пользователи, кроме отключенных.
$filter2 ="(objectCategory=OrganizationalUnit)"; // для получения информации о OU
$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];  			// name of place
$PlaceAddres = $placeinfo[0]["street"][0];		// address of place
$PlaceMail = $placeinfo[0]["description"][0]; 	// mail of place
$PlacePhone = $placeinfo[0]["st"][0]; 		// phone of plase

Toliau apipavidaliname puslapio viršų:

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> Name </td>
	<td width='250' bgcolor = #f0f0e4> E-mail </td>
	<td width='60' bgcolor = #f0f0e4> Phone </td>
	<td width='150' bgcolor = #f0f0e4> Mobile </td></tr>
	<tr><td></td><td> Данные OU </td><td>";
echo "<div class='transition-rotate'><a href=mailto:" . $PlaceMail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";

Tada mes gauname ir apdorojame naudotojo duomenis cikliškai, o norėdami paslėpti kai kurias (pavyzdžiui, paslaugų) paskyras, AD naudotojo duomenų lauke „kambaris“ tiesiog įveskite „hide“, tokie vartotojai nebus rodomas kataloge:

for ($i=0; $i<$info["count"];$i++) { 
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0];                //Имя пользователя
$UserPosition = $info[$i]["title"][0]; 		// Должность
$UserMail = $info[$i]["mail"][0];			//mail
if (!$UserMail)) $UserMail = "-";                  //если нет данных о ящике в AD, то отображаем прочерк
$UserIpPhone = $info[$i]["ipphone"][0];		//ip phone
	if (!$UserIpPhone) $UserIpPhone = "-";    //если нет данных о ящике в AD, то отображаем прочерк
$UserMobile = $info[$i]["mobile"][0];		//mobile
	if (!$UserMobile) $UserMobile = "-";     //если нет данных о ящике в AD, то отображаем прочерк

Beje, jei jums reikia gauti kito atributo vertę, atsiminkite (tai svarbu):
užklausoje perduodame atributo pavadinimą mažosios raidės laiškus, kitaip jis neveiks.

Ir įdėkite gautus duomenis į lentelę:

    echo "<tr>
	<td>". $n+=1 ."</td>
	<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; //	Имя пользователя и должность 
	if ($UserMail !='-') echo "<div class='transition-rotate'><a href=mailto:'$UserMail'>$UserMail  </a></div>";    // если у пользователя есть e-mail создаём ссылку на отправку письма
	else echo "-"; //если нет e-mail - ставим прочерк.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

Tada uždarome ldap ryšį arba rodome pranešimą apie negalėjimą prisijungti prie serverio:

ldap_close($ds); 
} 
else echo "<h4>Unable to connect to LDAP server</h4>"; 
echo '<br><br><br></body></html>';}

Failas „main_table.html“ iš vidaus yra paprastas html puslapis su nuorodomis ir atrodo maždaug taip:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>Adressbook of «YourMegaCompanyName»</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href=index.php><IMG border="none" src="logo.png"/></a></center>
<center><b>Places and offices</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>

Jei mano kodas kam nors padės, džiaugsiuosi, naudokite jį!

Taip pat galite laisvai redaguoti kaip norite (patobulinti/bloginti) ir platinti bet kokiomis priemonėmis.

Dėkojame už dėmesį!

Šaltinis: www.habr.com

Добавить комментарий