PHP + LDAP WEB мекенжай каталогын жасау

Осылайша (салыстырмалы түрде) үлкен науқанда пайдаланушылардың лайықты саны бар көптеген қашықтағы кеңселер болды. Барлық кеңселер ортақ домені бар бір желіге қосылған, әрбір кеңсе Active Directory (бұдан әрі - AD) ішінде пайдаланушылар бұрыннан құрылған Ұйымдық бөлімше (OU) ретінде анықталған.

Пайдаланушыларға AD-тен қажетті қызметкердің байланыс ақпаратын тез және қиындықсыз алуға мүмкіндік беру керек болды, ал жүйелік әкімшілерге мекенжай кітабының рөлін атқаратын мәтіндік файлды өңдеу процедурасынан босату қажет болды.

Мәселені шешудің дайын қолайлы нұсқалары болмады, сондықтан мен бәрін өз қолыммен және басыммен жасауға тура келді.

Алдымен нені пайдалану керектігін шешу керек екенін бастайық, бұл қарапайым - соңғы каталог браузер арқылы доменнің барлық пайдаланушыларына қолжетімді болуы керек. Ең бірінші ойға ldap-пен бірге РНР келеді, біз оларды қолданамыз. Мен РНР-ді қолданудың үлкен артықшылығы оның салыстырмалы қарапайымдылығы деп санаймын – аз да болса түсінігі бар кез келген жүйелік әкімші қажет болған жағдайда ерекше күш жұмсамай-ақ кодқа қажетті өзгерістерді енгізе алады.

Сонымен, бастайық. Алдымен доменге қосылу параметрлерін орнатайық:

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

Келесі нүкте - пайдаланушыларды қай OU ішінде іздейтінімізді анықтау. Біз мұны $_GET['place'] ішінен мәндерді ұстау арқылы жасаймыз. Мысалы, егер пайдаланушы мекенжайға барса server/index.php?place=бірінші, содан кейін айнымалы $орын мән тағайындалады бірінші.

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

Айнымалысы $doscript мәнді сақтау үшін қажет - біз пайдаланушыларды іздейтін OU анықтадық па, жоқ па. «Switch-case» тізімінде сәйкестіктер болмаса, $doscript=false, сценарийдің негізгі бөлігі орындалмайды және «main_table.html» бастапқы беті көрсетіледі (мен сізге бұл туралы айтып беремін. бұл ең соңында).

Егер біз OU анықтаған болсақ, онда біз келесі әрекеттерге көшеміз: пайдаланушы үшін каталог бетін салуды бастаймыз:

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

Бізге жағымдырақ көріну үшін стильдер кіреді (иә, оларды CSS файлы ретінде қосуға болады, бірақ IE-нің кейбір нұсқалары осылай орнатылған мәнерлерді қабылдағысы келмейді, сондықтан оларды тікелей сценарийге жазу керек):

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

Біз стильдермен аяқталдық, енді біз қойындының тақырыбын жазамыз және негізгі бетке оралу үшін ыңғайлы сілтеме жасаймыз:

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

Біз іздеу сүзгілерін AD бойынша анықтаймыз және 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

Әрі қарай беттің жоғарғы бөлігін құрастырамыз:

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

Әрі қарай, біз пайдаланушы деректерін циклде аламыз және өңдейміз, ал кейбір (мысалы, қызмет) тіркелгілерді жасыру үшін AD жүйесіндегі пайдаланушы мәліметтеріндегі «бөлме» өрісіне жай ғана «жасыру» енгіземіз, мұндай пайдаланушылар болмайды. каталогта көрсетіледі:

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

Айтпақшы, егер сізге басқа атрибуттың мәнін алу қажет болса, есте сақтаңыз (бұл маңызды):
сұрауда атрибут атауын береміз кіші әріп әріптер, әйтпесе ол жұмыс істемейді.

Алынған деректерді кестеге енгізіңіз:

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

Содан кейін біз ldap қосылымын жабамыз немесе серверге қосылу мүмкін еместігі туралы хабарламаны көрсетеміз:

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

Ішіндегі «main_table.html» файлы сілтемелері бар қарапайым html беті болып табылады және келесідей көрінеді:

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

Егер менің кодым біреуге көмектессе, мен қуаныштымын, оны қолданыңыз!

Сондай-ақ оны қалауыңыз бойынша еркін өңдеуге (жақсартуға/жамандыруға) және кез келген тәсілмен таратуға болады.

Назарларыңызға рахмет!

Ақпарат көзі: www.habr.com

пікір қалдыру