Bu yazıda PHP kullanıcı yetkilendirme sisteminin nasıl yapılacağını ve mantığını basit bir şekilde göreceksiniz. Sayfanın en altında PHP yetkilendirme sisteminin kaynak dosyasını indirebilirsiniz. Yetki sistemi ile amaçlanan nedir? Web sitelerinde böyle bir sisteme neden ihtiyaç duyarız?
Üyelik sistemi olan veya olmayan herhangi bir web sitesine birden fazla kişi giriyor ise kullanıcı kısıtlama ve yetki kontrol sisteminin olması bu sitenin güvenliğini arttıracaktır. Siteye giren bir kişiye yetkisine göre menü gösterimi, sayfa yetkilendirmesi ve belirli bölgelere girip, belirli bölgelere girememe gibi özelliklerin bulunması web sitesine esneklik ve güvenilirlik katacaktır.
Peki bu sayfada anlatılacak örnek yetki sisteminde
neler olacak ?
- Yetki ekleme, düzenleme, silme.
- Varsayılan yetki düzenlenmesi. Yani üyelik sistemi olan bir siteye kayıt olan kullanıcının belirlenmiş varsayılan yetkinin otomatik olarak atanması. Yetki silinir ise o yetkiye sahip kullacınıların varsayılan yetkili rütbesine atanması.
- Üye ekleme, düzenleme, silme.
- Basit üyelik sistemi (kayıt ol, giriş yap). Kayıt olunurken varsayılan yetki (basit üye) olarak atanması.
- Üyeye yetki atama, sayfa yetkilendirme mantığıyla kullanıcının sitede belirli yerlere girebilmesi, belirli işlemleri yapabilmesi, isminin yanında yetki ismi (ünvan) belirtme.
Kısaca bu makalede PHP yetki kontrol sisteminde olması gereken temel konular işlenmiştir.
PHP Yetkilendirme Sistemi Nasıl Yapılır?
Phpmyadmin üzerinden ‘yetkiler’ ve
‘kullanıcılar’ isminde 2 tane tablo oluşturuyoruz.
Yetkiler Tablosu
Yetkiler, ″yetki_ozellikler″ isimli kolonda aralarında virgül olacak şekilde saklanıyor. Mesela makale sayfasına girip makale işlemleri yapmaya yetkili olan kişiler ‘Admin’ ve ‘Yönetici’ rütbeli üyeler. Yetki renk ile kullanıcının isminin yanında ünvan olarak belirtilen rütbe isminin rengini ayarlayacağız. Yetki_varsayilan ise siteye birisi üye olduğunda otomatik hangi rütbeye sahip olması gerektiğini belirtir.
Kullanicilar Tablosu
PHP Yetkilendirme Mantığı
Bu örnekte göreceğiniz PHP yetkilendirme mantığını özetle açıklamak gerekirse;
Siteye üye olan kullanıcılar taşıdıkları rütbelere göre çeşitli yetkilere sahip olacaktır ve bu yetkilere göre belirli sayfalara girebilecekler, belirli bölgeleri görebilecekler veya göremeyeceklerdir.
Bu örnekte sitede belirli sayfa ve bölmelere isim belirledim. Bu isimlere göre yetki kontrolü yapılacak. Mesela üye ekleme ve düzenleme işlemlerinin yapıldığı “uye.php” dosyası ile yetki ekleme ve düzenleme işlemlerinin yapıldığı “yetki.php” dosyasının yetkilerdeki karşılığı “uyelik” tir. Makale işlemleri için “makale”, yorum işlemleri için “yorum”, mailler için “mail” şeklinde isimlendirme yaptım.
Phpmyadmin üzerinden oluşturduğumuz tablolarının yapıları ve barındırdıkları verileri yukarıdaki resimlerden kontrol edebilirsiniz.
Bu yetkilendirme sisteminde “Admin” rütbesine sahip kullanıcı “Muhammed Yaman”, normal “üye” rütbesine sahip kullanıcı “berat951” olarak tanımlı. “Yetkiler” tablosuna bakacak olursak “Admin” rütbesi “makale”, “yorum”, “mail”, “uyelik” yetkilerine sahipken, “üye” rütbesine sahip kullanıcının hiçbir yetkisi bulunmamakta. Siteye üye olan kullanıcı varsayılan olarak “üye” rütbesine sahip olacaktır. Bu ayarlamayı siteden yapabiliyorsunuz.
Siteye giriş yapan kullanıcının “Makaleler” sayfasına yetkisi olup olmadığını şu şekilde kontrol ediyoruz; Kullanıcının “kullanici_yetki_id” alanındaki rütbe id si üzerinden “yetkiler” tablosundan ilgili rütbenin “yetki_ozellikler” alanını çekiyoruz. Seçili rütbe eğer “Admin” ise “makale,yorum,mail,uyelik” verisini elde etmiş olacağız.
Metin parçalama için kullanılan PHP explode fonksiyonu ile elde edilen bu bilgileri virgül (,) karakterine göre parçalıyor ve dizi haline getiriyoruz. Dizi içinde arama işlemini gerçekleştiren PHP in_array fonksiyonu ile “makale” değerinin bu dizide var olup olmadığını kontrol ediyoruz. Var ise kullanıcının bu alana girme yetkisinin olduğunu anlıyoruz ve bu kontrolü sağlayan fonksiyondan “true” değeri döndürüyoruz. Bu yetki kontrol mantığıyla PHP’de yetkiye göre menü gösterimi ve sayfalara giriş kontrollerini yapabiliyoruz.
Aşağıda yetki sistemi uygulamasının kodlarını görebilirsiniz.
ayarlar.php dosyası
Veri ekleme, düzenleme, getirme işlemleri için aşağıdaki mysqli fonksiyonlarını kullanacağım. Aşağıda PHP kullanıcı yetkilendirme uygulamasında kullanacağım veritabanı bağlantı işlemleri için kullanılan mysqli komutları ve PHP session yetkilendirme işleminde session oluşturmayı daha basit hale getirmek için “session_olustur fonksiyonu” bulunmakta.
error_reporting(0);
session_start();
// Veritabani Baglanti
$host = 'localhost'; //host
$user = 'root'; //kullanici adi
$pass = ''; //sifre
$db = 'auth_system'; //veritabani ismi
$baglan = mysqli_connect($host, $user, $pass, $db) or die (mysqli_Error()); //baglanti
mysqli_query($baglan,"SET CHARACTER SET 'utf8'");
mysqli_query($baglan,"SET NAMES 'utf8'");
// Fonksiyonlar
function query($query){
global $baglan;
return mysqli_query($baglan,$query);
}
function row($query){ //row(..)['kolon_isim']
return mysqli_fetch_assoc($query);
}
function row2($query){ //row(..)['kolon_isim'] veya row(..)[sayi]
return mysqli_fetch_array($query);
}
function row3($query){ //row(..)[sayi]
return mysqli_fetch_row($query);
}
function rows($query){ //rows(..) - veri satır sayisi dondurur
return mysqli_num_rows($query);
}
function affected_rows(){ //sorgu sonucunda etkilenen satir sayisini dondurur
global $baglan;
return mysqli_affected_rows($baglan);
}
function session_olustur($par){
foreach ($par as $anahtar => $deger){
$_SESSION[$anahtar] = $deger;
}
}
Kullanıcının yetkisine göre sayfalara ve bölgelere girebilmesini, işlemler yapabilmesini sağlamak için aşağıdaki fonksiyonu kullanacağız.
function yetki_kontrol($rutbe,$ozellik){ //belirtilen rutbenin belirtilen yetkisi bulunuyor mu kontrol et
$yetki = row(query('SELECT yetki_ozellikler FROM yetkiler WHERE ID=''.$rutbe.'' LIMIT 1'));
$ozellikler = explode(',', $yetki['yetki_ozellikler']);
if (in_array($ozellik, $ozellikler)){ //bu rütbe bu yetkiye sahip
return true;
}else{ //degil
return false;
}
}
Bu fonksiyon ile kullanıcının rütbesini ve
yapacağı işlem veya gireceği bölgenin string tipinde bir
belirtecini alıp veritabanında bu rütbeye ait verileri çekiyoruz.
Bu rütbenin belirtilen yetkiye sahip olup olmadığını kontrol
ediyoruz. Yetkisi varsa ″true″, yoksa ″false″ değeri dönüyor
ve bu değere göre kullanıcı o işlemi yapabiliyor veya o bölgeye,
sayfaya girebiliyor.
Aşağıdaki fonksiyon ile kullanıcının isminin yanında yetkili olduğu ünvanı yazdırıyoruz.
function yetki_tag($rutbe){ //yetkili kişinin isminin yanında ünvanını belirtilen renk doğrultusunda göster
$yetki_sorgu = query('SELECT SQL_CALC_FOUND_ROWS yetki_isim,yetki_renk FROM yetkiler WHERE ID=''.$rutbe.'' LIMIT 1');
if (row3(query('SELECT FOUND_ROWS()'))[0]){
$yetki = row($yetki_sorgu);
return ''.$yetki['yetki_isim'].'';
}
return '';
}
index.php dosyası
“index.php” dosyasını oluşturuyoruz ve “ayarlar.php” dosyasını PHP require fonksiyonu ile sayfaya dahil ediyoruz. Bu sayfada kullanıcı oturum açtı ise yetkili paneli gösteriyoruz, oturum açmadı ise “membership.php” dosyasına ziyaretçiyi yönlendiriyoruz. Oturum açan kullanıcı yetkisine göre menüleri görebiliyor ve bu menülere tıklayarak o sayfaya erişebiliyor, o sayfadaki işlemleri yapabiliyor.
PHP Yetki Sistemi
Hoş geldin [ ]
Anasayfa
Makaleler
Yorumlar
Mailler
Yetki Ayarları
Üyeler
Çıkış Yap
Anasayfa
İlk açılan sayfa.
membership.php dosyası
Bu sayfada ise ziyaretçi giriş yapabilir veya kayıt olabilir. Giriş yapma yada kayıt olma işlemi başarılı olduğunda oturum açılır, session bilgileri kaydedilir ve kullanıcı anasayfaya yönlendirilir. Kullanıcı oturumu kapatmak isterse yine bu sayfaya yönlendirilir, oturum bilgileri silinir ve giriş sayfasına yönlendirilir. Hatalı girişlerde gerekli bilgilendirme mesajları kullanıcıya yansıtılır.
true,
'kullanici_id' => $kullanici['ID'],
'kullanici_isim' => $kullanici['kullanici_isim'],
'kullanici_yetki' => $kullanici['kullanici_yetki_id']
);
session_olustur($session);
echo 'Başarıyla giriş yapıldı. Yönlendiriliyorsunuz.';
}else{
echo 'Böyle bir kullanıcı bulunmuyor';
}
}else{
echo 'Boş geçmeyin';
}
header('Refresh: 3; url=index.php');
}else if ($_GET['type'] == 'register'){ //kayit ol
$kullanici_isim = $_POST['kisim'];
if ($kullanici_adi && $kullanici_sifre && $kullanici_isim){
$kullanici = row3(query('SELECT ID FROM kullanicilar WHERE kullanici_adi=''.$kullanici_adi.'''))[0];
if (!$kullanici['ID']){ //bu kullanici sistemde kayitli değil ise kullanıcıyı olustur ve oturumu baslat
$varsayilan_yetki = row3(query('SELECT ID FROM yetkiler WHERE yetki_varsayilan = 1'))[0];
query('INSERT INTO kullanicilar SET
kullanici_isim = ''.$kullanici_isim.'',
kullanici_sifre = ''.$kullanici_sifre.'',
kullanici_adi = ''.$kullanici_adi.'',
kullanici_yetki_id = ''.$varsayilan_yetki.''
');
if (affected_rows()){
$session = array(
'giris' => true,
'kullanici_id' => $kullanici_adi,
'kullanici_isim' => $kullanici_isim,
'kullanici_yetki' => $varsayilan_yetki
);
session_olustur($session);
echo 'Başarıyla üye olundu. Yönlendiriliyorsunuz.';
}else{
echo 'Bir hata oluştu. Daha sonra tekrar deneyin.';
}
}else{
echo 'Böyle bir kullanıcı mevcut';
}
}else{
echo 'Boş geçmeyin';
}
header('Refresh: 3; url=index.php');
}else{
header("Location: index.php");
}
}
if ($_GET['type'] == 'login'){?>
Giriş Yap
Kayıt Ol
Kayıt Ol
Giriş Yap
Başarıyla çıkış yapıldı. Yönlendiriliyorsunuz.