Veebiaadressi kataloogi loomine PHP + LDAP

Juhtus nii, et (suhteliselt) suurel kampaanial oli palju kaugkontoreid korraliku kasutajate arvuga. Kõik kontorid on ühendatud ühte võrku ühise domeeniga, iga kontor määratleti Active Directorys (edaspidi AD) organisatsiooniüksusena (OU), milles kasutajad olid juba loodud.

Vaja oli anda kasutajatele võimalus kiiresti ja vaevata AD-st vajaliku töötaja kontaktandmed hankida ning vabastada süsteemiadministraatorid aadressiraamatu rolli täitva tekstifaili toimetamise rutiinist.

Probleemi lahendamiseks polnud valmis sobivaid variante, nii et pidin kõike oma käte ja peaga tegema.

Alustame sellest, et kõigepealt tuleb otsustada, mida kasutada, see on lihtne – lõplik kataloog peaks olema brauseri kaudu kõigile domeeni kasutajatele kättesaadav. Esimene asi, mis meelde tuleb, on PHP koos ldapiga ja me kasutame neid. PHP kasutamise suureks plussiks pean selle suhtelist lihtsust – iga vähegi arusaamisega süsteemiadministraator suudab vajadusel teha koodis vajalikud muudatused ilma erilise pingutuseta.

Niisiis, alustame. Esmalt määrame domeeniga ühenduse loomise parameetrid:

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

Järgmine punkt on määrata, millises OU-s me kasutajaid otsime. Teeme seda, püüdes kinni väärtused allikast $_GET['place']. Näiteks kui kasutaja läheb aadressile server/index.php?place=esimene, siis muutuja $koht määratakse väärtus esimene.

$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";

Muutuv $doscript on vaja väärtuse salvestamiseks – olenemata sellest, kas oleme määratlenud OU, millest kasutajaid otsime, või mitte. Kui lahtris "switch-case" pole ühtegi vastet, siis $doscript=false, skripti põhiosa ei käivitata ja kuvatakse avaleht "main_table.html" (ma räägin teile see päris lõpus).

Kui oleme määratlenud OU, jätkame edasiste toimingutega: hakkame kasutajale kataloogilehte joonistama:

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/ '>

Lisame stiile meeldivama välimuse huvides (jah, neid võiks lisada css-failina, kuid mõned IE versioonid ei taha sellisel viisil seatud stiile aktsepteerida, nii et peate need otse skripti kirjutama):

<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>

Oleme stiilidega valmis, nüüd kirjutame vahelehe pealkirja ja joonistame avalehele naasmiseks mugava lingi:

<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>
";

Määratleme otsingufiltrid AD järgi ja saame andmeid OU kohta:

$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

Järgmisena kujundame lehe ülaosa:

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>";

Järgmisena võtame vastu ja töötleme kasutajaandmeid tsüklina, samas kui mõne (näiteks teenuse) konto varjamiseks sisestame AD-s kasutajaandmete väljale "tuba" lihtsalt sõna "peida", selliseid kasutajaid ei kuvata. kuvatakse kataloogis:

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, то отображаем прочерк

Muide, kui teil on vaja saada mõne muu atribuudi väärtus, pidage meeles (see on oluline):
päringus edastame atribuudi nime väiketähtedega kirjad, muidu see ei tööta.

Ja sisestage saadud andmed tabelisse:

    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>";

Järgmisena sulgeme ldap-ühenduse või kuvame teate serveriga ühenduse loomise võimatuse kohta:

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

Fail "main_table.html" seestpoolt on lihtne linkidega html-leht ja näeb välja umbes selline:

<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>

Kui minu kood kedagi aitab, olen rõõmus, kasutage seda!

Samuti saate seda vabalt oma soovi järgi redigeerida (parandada/halvendada) ja levitada seda mis tahes viisil.

Tänan teid tähelepanu eest!

Allikas: www.habr.com

Lisa kommentaar