Loome WEB aadressite registrit PHP + LDAP

Juhtus nii, et (suhteliselt) suurel ettevĂ”ttel oli palju kauoffice, kus viibis tubli hulk kasutajaid. KĂ”ik kontorid on ĂŒhendatud ĂŒhte vĂ”rku ĂŒhise domeeniga, iga kontor on mÀÀratletud Active Directory's (edaspidi AD) kui Organisatsiooni Üksus (OU), kus juba on loodud kasutajad.

Kasutajatele tuli anda vĂ”imalus kiiresti ja vaevata saada vajalikku töötaja kontaktandmeid AD-st, ning vabastada sĂŒsteemi administraatorid igapĂ€evasest tekstifaili redigeerimise rutiinist, mis toimis aadressiraamatuna.

Sobivaid lahendusi etteantud ĂŒlesande tĂ€itmiseks ei leitud, seega tuli kĂ”ik ise teha.

Alustame sellest, et kĂ”igepealt tuleb otsustada, mida kasutada, see on lihtne — lĂ”plik kĂ€siraamat peab olema kĂ”igile domeeni kasutajatele brauseri kaudu kĂ€ttesaadav. Esimene asi, mis pĂ€he tuleb, on PHP koos ldap'iga, neid me ka kasutame. PHP kasutamise suur pluss on minu arvates selle suhteline lihtsus — iga vĂ€hegi sĂŒsteemi administreerimisega tuttav isik suudab vajadusel koodis vajalikud muudatused teha, ilma et peaks palju pingutama.

Nii et, alustame. Esiteks mÀÀratleme domeeni ĂŒhendamise parameetrid:

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

JĂ€rgmiseks tuleb mÀÀratleda, millises OU-s me kasutajaid otsime. Seda teeme, saades vÀÀrtused $_GET[‘place’]-st. NĂ€iteks, kui kasutaja lĂ€heb aadressile server/index.php?place=first, siis muutujale $place anti vÀÀrtus 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;
	// siia saab lisada veel tingimusi.
default:
	$doscript=false; 
	break;
}
if (!$doscript) include "main_table.html";

Muutuja $doscript on vajalik vÀÀrtuse hoidmiseks — kas oleme mÀÀratlenud OU, kus me kasutajaid otsime vĂ”i mitte. Kui «switch-case» sees ei leitud vasteid, siis $doscript=false, peamine skript ei kĂ€ivitu ning kuvatakse algsest lehe "main_table.html" (millest rÀÀgin lĂ”pus).

Kui me oleme mÀÀratlenud OU, siis liigume edasi: hakkame kasutajale kÀsiraamatulehte kujundama:

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

LĂŒlitame sisse stiilid, et muuta vĂ€limust meeldivamaks (jah, need oleks saanud lisada CSS-failina, kuid mĂ”ned IE versioonid ei taha sellisel viisil mÀÀratud stiile tunnustada, seega tuleb kirjutada otse skripti):

*{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;}

Stiilidega on nĂŒĂŒd kĂ”ik selge, nĂŒĂŒd kirjutame vahelehe pealkirja ja loome mugava tagasivĂ€ljaande lingi pĂ”hilehele:

<title>«YourMegaCompanyName» aadressiraamat</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>Avaleht</p></a>
</td></tr></table>
";

MÀÀrame AD jÀrgi otsingufiltrid ja saame teavet OU kohta:

$filter ="(&(objectcategory=user)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"; //kÔik kasutajad, vÀlja arvatud deaktiveeritud.
$filter2 ="(objectCategory=OrganizationalUnit)"; // OU kohta teabe saamiseks
$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];  			// koha nimi
$PlaceAddres = $placeinfo[0]["street"][0];		// koha aadress
$PlaceMail = $placeinfo[0]["description"][0]; 	// koha e-post
$PlacePhone = $placeinfo[0]["st"][0]; 		// koha telefon

SeejĂ€rel kujundame lehe ĂŒlemise osa:

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"> Nimi </td>
	<td width='250' bgcolor = "#f0f0e4"> E-mail </td>
	<td width='60' bgcolor = "#f0f0e4"> Telefon </td>
	<td width='150' bgcolor = "#f0f0e4"> Mobiilne </td></tr>
	<tr><td></td><td> OU andmed </td><td>";
echo "<div class='transition-rotate'><a href="mailto:"" . $placemail .">" . $PlaceMail ." </a></div>";
echo "</td><td width='150'> " . $PlacePhone ." </td><td> - </td></tr>";

SeejĂ€rel saame tsĂŒklis ja viime lĂ€bi kasutajate andmete töötlemise, samas, et peita mĂ”ned (nĂ€iteks administraatorikontod), kirjutame lihtsalt "hide" vĂ€lja "ruum" vĂ€ljas AD kasutaja atribuutides, need kasutajad ei kajastu kataloogis:

for ($i=0; $i<$info["count"];$i++) { 
$UserHide = $info[$i]["physicaldeliveryofficename"][0];
if ($UserHide != 'hide') {
$UserName = $info[$i]["cn"][0];                //Kasutajanimi
$UserPosition = $info[$i]["title"][0]; 		// Amet
$UserMail = $info[$i]["mail"][0];			//mail
if (!$UserMail)) $UserMail = "-";                  //kui AD-s ei ole postkasti andmeid, siis kuvatakse sidekriips
$UserIpPhone = $info[$i]["ipphone"][0];		//ip telefon
	if (!$UserIpPhone) $UserIpPhone = "-";    //kui AD-s ei ole postkasti andmeid, siis kuvatakse sidekriips
$UserMobile = $info[$i]["mobile"][0];		//mobiil
	if (!$UserMobile) $UserMobile = "-";     //kui AD-s ei ole postkasti andmeid, siis kuvatakse sidekriips

Muide, kui teil on vajalik saada teise atribuudi vÀÀrtust, siis pidage meeles (see on oluline):
esitame pÀringus atribuudi nime vÀikeste tÀhtedega, muud juhul ei tööta.

Ja sisestame saadud andmed tabelisse:

    echo "<tr>
	<td>". $n+=1 ."</td>
	<td> ". $UserName ."<br> <div class='smalltext'>". $UserPosition ."</div></td><td>"; // Kasutaja nimi ja ametikoht 
	if ($UserMail !='-') echo "<div class='transition-rotate'><a href="mailto:'$UserMail'">$UserMail  </a></div>";    // kui kasutajal on e-post, loome lingi kirja saatmiseks
	else echo "-"; // kui ei ole e-posti - paneme kriipsu.
 	echo "<td> ". $UserIpPhone ." </td>
 	<td> ". $UserMobile ." </td></tr>";
	}
}
echo "</table>";

SeejĂ€rel sulgeme ldap-ĂŒhenduse vĂ”i kuvame teadet serveriga ĂŒhenduse loomise ebaĂ”nnestumisest:

ldap_close($ds); 
} 
else echo "<h4>LDAP serveriga ei õnnestu ühenduda</h4>"; 
echo '<br><br><br></body></html>';}

Fail „main_table.html“ sisaldab lihtsat html lehte linkidega ja nĂ€eb vĂ€lja umbes nii:

<head>
<link rel="shortcut icon" href="ico.png"/>
<meta charset="windows-1251"/>
<title>«YourMegaCompanyName» aadressiraamat</title>
</head>
<body style='background-color:#ffffff;'>
<center><a href="index.php"><img border="none" src="logo.png"/></a></center>
<center><b>Toad ja kontorid</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 mu kood kellelegi aitab — olen rÔÔmus, kasutage seal, kus vaja!

Samuti vÔite seda vabalt redigeerida nii, nagu soovite (parandada/kodata) ja levitada erinevate meetoditega.

AitÀh tÀhelepanu eest!

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster