LDAP Kullanımı
LDAP (Lightweight Directory Access Protocol), bir nevi dizin servisi standardıdır. Dizin servisleri hiyararşik bir yapıda (dizin yapısında), veriye merkezi olarak ulaşılması için düşünülmüş bir nevi veritabanı hizmeti veren sistemlerdir. Açık sistem olması dünya üzerinde global olarak erişilebilir bilgi kaynakları oluşturulabilmesini sağlar. Bunu yaparken coğrafi yapı (ülke, şehir), kurum içi organizasyon ve diğer özellikleri içeren hiyerarşik bir yapı kullanır.
Özellikle kurum içi organizasyon ve personelin kayıtlarının tutulabileceği elverişli bir ortam sunar. Bir kurumda çalışan veya bir üniversitede okuyan öğrencilere çeşitli servisler sunmanız gerekir. Bunun için her servisin üzerinde çalıştığı makinada ayrı ayrı kullanıcı hesapları açmanız gerekebilir. Böyle olunca sistemin ve kullanıcıların yönetimi zorlaşır. LDAP kullanarak bu sorun çözülebilir.
Kuruma giren personel için LDAP sunucusuna tek bir entry eklersiniz ve LDAP desteği veren servislerin bu sunucu üzerinden kullanıcı bilgilerine erişim ve doğrulama yapmalarını sağlayabilirsiniz.
PHP'de LDAP için iyi bir arabirim sunmaktadır. Bu sayede web uygulamalarınızda da LDAP kullanılabilmekte ve özellikle kullanıcılara kendilerine ait verileri güncelleyebilme olanağı sunuluyor.
LDAP servisleri
LDAP dizinleme sisteminde her kayda ait özellikler (attributes) ve bu özelliklerin değerleri (values) vardır. Her kaydın ait olduğu bir nesne sınıfı (object class) vardır. Bu yapı sayesinde dünya üzerindeki her LDAP kaydı biricik olur. Bunun için DNS de olduğu gibi hiyerarşik bir isimlendirme kullanılmıştır. Kullanıcı bu biricikliğini DN (Distinguished Name) özelliğinden alır.
Örneğin
dn='cn=Mustafa Hadi Dilek, o=Ulakbim, c=tr' benim Türkiye içinde, Ulakbim adlı kuruluşta, adı 'Mustafa Hadi Dilek' olan kişi olduğumu söyler ve biriciktir.
Personele ait bazı özellikler şunlardır:
- uid (User ID), sistemdeki kullanıcı adı,
- cn (Common Name), kullanıcının adı soyadı,
- sn, kullanıcının soyadı,
- mail, kullanıcının e-mail adresi,
- telephonenumber, kullanıcının telefonu
PHP Arayüzü
PHP ile LDAP erişimi oldukça kolaydır. İzlenmesi gereken sıra:
- LDAP sunucusuna bağlanma (ldap_connect) ve bir bağlantı numarası (link identifier) alma,
- Bu bağlantıyı ve doğrulama bilgileri kullanarak sunucuya login olma (ldap_bind),
- Bind edilmiş bu bağlantıyı kullnarak LDAP işlevleri gerçekleştirme (ldap_search, ldap_modify, vs...),
- Elde edilen sonuçları associative dizilere aktararak kullanma (ldap_get_entries, vs...),
Örnek Uygulama (LDAP Web Geçidi)
PHP'yi LDAP geçidi olarak kullanmak için 'Netscape Directory SDK for C' si veya OpenLdap client kütüphaneleri kurulu olmalı ve PHP derlenirken bu kütüphaneler belirtilmelidir. Her iki client librarysi de Internet'den ücretsiz olarak çekilebilir.
Sunucu olarak Netscape Directory Server 4.3 kullanmamıza rağmen, istemci tarafında OpenLDAP 1.2 clientleri kullandık. PHP olarak 4.0.3 beta versiyonu kullanıldı. LDAP search işlevinde sorunla karşılaşmazken modify işlevinde sorunla karşılaştık (PHP'nin beta versiyonu olmasından kaynaklanıyor sanırım) ve bu sorunu da şimdilik yine OpenLDAP'ın ldapmodify programını shell'den çağırarak çözdük.
Arama için açılan formda gerekli kriterler ve arama metni giriliyor:
Form submit edilince çağrılan php scriptinde önce sunucuya bağlantı kuruluyor. Sunucu standart olarak '339' numaralı portu kullanır:
$myconnection=ldap_connect(_HOST,"339");Anonymous olarak login olunuyor:
ldap_bind($myconnection);Şmdi arama komutu için:
- Aramanın yapılacağı alan (base dn): 'o=ulakbim'
- Filtre: Formdan gelen değere göre örneğin 'cn=Mustafa Hadi Dilek'
parametreleri de kullanılarak:
$res = ldap_search($myconnection, "o=ulakbim", $filtertype."=".$filtertext);Elde edilen sonuç numarası kullanılarak sonuçlar çok boyutlu bir sizi içine alınıyor:
$info = ldap_get_entries($myconnection, $result);Bu dizi, dinamik tablo oluşturularak tarayıcıya gönderiliyor:
Beliri alanlar için her kullanıcının kendi LDAP entrysini değiştirebilbesi sağlanabilmelidir. Bunun için önce LDAP sunucusuna anonymous olarak değil, geçerli bir kullanıcı olarak bağlantı kurmalıdır:
Alınan kullanıcı adı ve şifre bu defa binding işlemi için kullanılıyor:
$dn = "uid=".$user.",o=ulakbim";if (!($r = @ldap_bind($myconnection, $dn, $pwd))) { @header("Location: ldap_login.php?unauth=YES"); exit;}Bu aşamadan başarı ile geçilirse değişiklik formu alanların içleri dolu olarak kullanıcıya gönderiliyor:
Kullanıcı bu formu kullanarak entrysini değiştirebilir. PHP 4.0.3 betasında ldap_modify doğru çalışmadığı için kendi fonksiyonumuzu kullandık:
//--- Herhangi LDAP client yaziliminda bulunan ldapmodify programini kullanarak //--- LDAP entrysinde degisiklik yapar //--- Input parametreleri: //----- Kullanicinin distinguished name (dn) bilgisi, //----- Kullanicinin LDAP serverdeki sifresi, //----- Degisiklikleri iceren bir hash array //--- Burada bir modify stringi, standart ldif formatinda olusturulur. //--- Bu format 'man ldapmodify' ile gorulebilir. //--- Veya Michigan Universitesinin ldap manual web sayfasinda ayrintili olarak var. //---
www.umich.edu dan aranabilir. function my_ldap_modify($dn, $pwd, $changes) { $modifystr = _QUOTE."dn: ".$dn._CRLF."changetype: modify"._CRLF; while(list($key,$val)=each($changes)) { $modifystr = $modifystr."replace: ".$key._CRLF.$key.": ".$val._CRLF."-"._CRLF; } $modifystr = $modifystr._QUOTE; exec("printf ".$modifystr." | "._LDAP_DIR._LDAP_MODIFY." -h "._HOST." -p "._PORT." -D ".$dn." -w ".$pwd); } //-----------------------------------/