PHP + LDAP WEB ünvan kataloqu yaradın

Belə oldu ki, (nisbətən) böyük bir kampaniyada layiqli sayda istifadəçisi olan çoxlu uzaq ofislər var idi. Bütün ofislər ümumi domenlə bir şəbəkəyə qoşulmuşdur, hər bir ofis Active Directory-də (bundan sonra AD adlandırılacaq) istifadəçilərin artıq yaradıldığı Təşkilat Bölməsi (OU) kimi müəyyən edilmişdir.

İstifadəçilərə AD-dən tələb olunan işçinin əlaqə məlumatlarını tez və çətinlik çəkmədən əldə etmək, sistem administratorlarına isə ünvan kitabçası rolunu oynayan mətn faylını redaktə etməkdən azad olmaq imkanı vermək lazım idi.

Problemi həll etmək üçün hazır uyğun variantlar yox idi, buna görə də hər şeyi öz əllərim və başımla etməli oldum.

Gəlin ondan başlayaq ki, əvvəlcə nədən istifadə edəcəyinizə qərar verməlisiniz, bu sadədir - yekun kataloq brauzer vasitəsilə domenin bütün istifadəçiləri üçün əlçatan olmalıdır. İlk ağlımıza ldap ilə birlikdə PHP gəlir və biz onlardan istifadə edəcəyik. Mən PHP-dən istifadə etməyin böyük üstünlüyünü onun nisbi sadəliyi hesab edirəm - azacıq da olsa anlayışı olan istənilən sistem administratoru, lazım gələrsə, xüsusi gərginləşdirmədən kodda lazımi dəyişikliklər edə biləcək.

Beləliklə, başlayaq. Əvvəlcə domenə qoşulmaq üçün parametrləri təyin edək:

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

Növbəti məqam istifadəçiləri hansı OU-da axtaracağımızı müəyyən etməkdir. Biz bunu $_GET['place']-dən dəyərləri tutmaqla edəcəyik. Məsələn, əgər istifadəçi ünvana gedirsə server/index.php?place=ilk, sonra dəyişən $yer dəyər təyin olunacaq ilk.

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

Dəyişən $doscript dəyəri saxlamaq üçün lazımdır - istifadəçiləri axtaracağımız OU-nu müəyyən etmişik, ya yox. “Switch-case” siyahısında heç bir uyğunluq yoxdursa, $doscript=false, skriptin əsas hissəsi icra olunmayacaq və “main_table.html” başlanğıc səhifəsi göstəriləcək (sizə bu barədə məlumat verəcəyəm) ən sonunda).

Bir OU müəyyən etdiksə, sonrakı hərəkətlərə davam edirik: istifadəçi üçün kataloq səhifəsini çəkməyə başlayırıq:

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

Daha xoş görünüş üçün üslubları daxil edirik (bəli, onlar css faylı kimi daxil edilə bilər, lakin IE-nin bəzi versiyaları bu şəkildə təyin edilmiş üslubları qəbul etmək istəmir, ona görə də onları birbaşa skriptə yazmalısınız):

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

Üslublarla işimiz bitdi, indi nişanın başlığını yazırıq və əsas səhifəyə qayıtmaq üçün rahat bir keçid çəkirik:

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

Axtarış filtrlərini AD ilə müəyyən edirik və OU haqqında məlumat əldə edirik:

$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

Sonra səhifənin yuxarı hissəsini tərtib edirik:

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

Sonra, biz istifadəçi məlumatlarını dövrədə qəbul edirik və emal edirik, bəzi (məsələn, xidmət) hesabları gizlətmək üçün sadəcə olaraq AD-də istifadəçi təfərrüatlarında “otaq” sahəsinə “gizlət” daxil edirik, belə istifadəçilər olmayacaq. kataloqda göstərilir:

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

Yeri gəlmişkən, başqa bir atributun dəyərini almaq lazımdırsa, unutmayın (bu vacibdir):
sorğuda biz atribut adını keçirik kiçik hərf məktublar, əks halda işləməyəcək.

Və alınan məlumatları cədvələ daxil edin:

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

Sonra, ldap bağlantısını bağlayırıq və ya serverə qoşulmağın mümkünsüzlüyü barədə bir mesaj göstəririk:

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

İçəridən “main_table.html” faylı linkləri olan sadə html səhifəsidir və belə görünür:

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

Kodum kiməsə kömək etsə, şad olaram, istifadə edin!

Siz həmçinin onu istədiyiniz kimi sərbəst şəkildə redaktə edə (yaxşılaşdıra/pisləşdirə) və istənilən vasitə ilə yaya bilərsiniz.

Diqqətiniz üçün təşəkkür edirik!

Mənbə: www.habr.com

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