Genelde Web uygulamalarında login modülü hazırlanırken giriş yapacak kullanıcının bilgileri veri tabanında (MySQL, MSSQL, MariaDB vs) tutulur, zaten kullanıcı kendi kayıt olsun diye bir register alanı bulunur. Günün sonunda ziyaretçi, Web Uygulamasına giriş yaparken kullanıcı adı ve şifre bilgileri veri tabanından sorgulanır.
Bu yazıda ise, iç kullanım için yazılan bir login modülü düşünün ve ortamda hali hazırda bulunan bir active directory yapısı mevcut diyelim. Bu durumda kullanıcılar için tekrardan bir DB, tablo, kolon vs oluşturmak zorunda olmayacağımız gibi register sayfasına da ihtiyaç duymayacağım demektir.
Yukarıdaki senaryoya göre önce kullanıcı adı – şifre bilgilerini LDAP ile sorgulayacağım eğer bilgiler doğru ve kullanılan kullanıcı adı “WebYonetici” grubuna üye ise protected.php sayfasını görüntüleyecek. Eğer kullanıcı “WebKullanici” grubuna üye ise oturum açılacak fakat protected.php sayfasını görmek istediğinde ise “Erişim Engellendi” uyarısı ile karşılaşacaktır. Bu iki olasılık dışında kullanıcı adı – şifre bilgilerinden biri yanlış ya da WebYönetici – WebKullanici gruplarından birine üye olmayan herhangi bir kullanıcı için “Giriş başarısız: Geçersiz kullanıcı adı veya şifre” hatası dönecektir.
authenticate.php
<?php function authenticate($user, $password) { if(empty($user) || empty($password)) return false; // active directory sunucusu $ldap_host = "acme.local"; //IP ya da hostname // active directory DN $ldap_dn = "DC=acme,DC=local"; // active directory kullanıcı grup adı $ldap_user_group = "WebKullanici"; // active directory yönetici grup adı $ldap_manager_group = "WebYonetici"; // domain $ldap_usr_dom = '@acme.local'; // active directory ile bağlantı kuruluyor $ldap = ldap_connect($ldap_host); // ldap params yapılandırılıyor ldap_set_option($ldap,LDAP_OPT_PROTOCOL_VERSION,3); ldap_set_option($ldap,LDAP_OPT_REFERRALS,0); // kullanıcı adı ve şifre doğrulanıyor. if($bind = @ldap_bind($ldap, $user.$ldap_usr_dom, $password)) { // geçerli // gruplarda varlığı kontrol ediliyor. $filter = "(sAMAccountName=".$user.")"; $attr = array("memberof"); $result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("LDAP sunucusunda arama yapılamıyor"); $entries = ldap_get_entries($ldap, $result); ldap_unbind($ldap); // gruplar kontrol ediliyor. $access = 0; foreach($entries[0]['memberof'] as $grps) { // yöneticiyse, loop'u durdur if(strpos($grps, $ldap_manager_group)) { $access = 2; break; } // kullanıcıysa if(strpos($grps, $ldap_user_group)) $access = 1; } if($access != 0) { // oturum değişkenlerine ulaşılıyor. $_SESSION['user'] = $user; $_SESSION['access'] = $access; return true; } else { // kullanıcının yetkisi yok. return false; } } else { // geçersiz kullanıcı adı ya da şifre return false; } } ?>
login.php
<?php // oturumu başlatıyoruz. session_start(); include("authenticate.php"); // eğer kullanıcı çıkış yapıyorsa kontrol et if(isset($_GET['out'])) { // oturumu yoket session_unset(); $_SESSION = array(); unset($_SESSION['user'],$_SESSION['access']); session_destroy(); } // giriş formu gönderildiyse kontrol et if(isset($_POST['userLogin'])){ // bilgileri kimlik doğrulayıcı aracılığıyla çalıştırmak if(authenticate($_POST['userLogin'],$_POST['userPassword'])) { // kimlik doğrulama geçti. header("Location: protected.php"); die(); } else { // kimlik doğrulama başarısız. $error = 1; } } // kullanıcıya hata mesajı if(isset($error)) echo "Giriş başarısız: Geçersiz kullanıcı adı veya şifre<br />"; // kullanıcıya başarılı çıkış mesajı if(isset($_GET['out'])) echo "Çıkış başarılı"; ?> <form action="login.php" method="post"> User: <input type="text" name="userLogin" /> Password: <input type="password" name="userPassword" /> <input type="submit" name="submit" value="Submit" /> </form>
protected.php
<?php // Oturumu başlat session_start(); if(!isset($_SESSION['user'])) { // kullanıcı giriş yapmamışsa login.php'ye yönlendir. header("Location: login.php"); die(); } if($_SESSION['access'] != 2) { // diğer örnek... // kullanıcı giriş yaptı ama yönetici hakkı yoksa durdur. die("Erişim Engellendi"); } ?> <p>Hosgeldin <?= $_SESSION['user'] ?>!</p> <p><strong>Gizli ve korunakli icerik buradadir!</strong></p> <p><a href="login.php?out=1">Logout</a></p>
Yukarıdaki bu 3 kod blogunu kayıt edip kendi local çalışma alanınızda test edebilirsiniz.
Not: Eğer giriş esnasında tarayıcınızda aşağıdakine benzer bir hata oluşuyorsa php.ini’den ldap extension’u aktif hale getirdikten sonra servisleri yeniden başlatmanız gerekecektir.
( ! ) Fatal error: Uncaught Error: Call to undefined function ldap_connect() in C:\wamp64\www\test\authenticate.php on line 21 | ||||
---|---|---|---|---|
( ! ) Error: Call to undefined function ldap_connect() in C:\wamp64\www\test\authenticate.php on line 21 | ||||
Call Stack | ||||
# | Time | Memory | Function | Location |
1 | 0.0018 | 410832 | {main}( ) | …\login.php:0 |
2 | 0.0055 | 411736 | authenticate( ) | …\login.php:19 |