PHPProgramlama

PHP ile LDAP Active Directory Kimlik Doğrulama

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

 

Serdar Kurt

Merhaba, 1986 Ankara doğumluyum. Sakarya Üniversitesi Bilgisayar Programcılığı mezunuyum. Şu an özel bir şirkette Security Engineer pozisyonunda görev yapıyorum. Bilişim Teknolojileri alanında kendimi geliştirmeye devam ediyorum.

İlgili Makaleler

Abone ol
Bildir
guest
4 Yorum
Eskiler
En Yeniler Beğenilenler
Satır İçi Geri Bildirimler
Tüm yorumları görüntüle
Başa dön tuşu

Reklam Engelleyici Algılandı

Bana destek olmak için lütfen reklam engelleyicinizi devre dışı bırakınız ya da bu siteyi izin verilenler listesine ekleyiniz.