Çarşamba, Haziran 20, 2007

Session kontrollerini kontrol altina alma

Kullanicilarin login olmasini gerektiren uygulamalarda, kullanici tarafindan tarayicinin adres cubuguna adres girilerek ula$ilabilinecek her URL icin, oradaki scriptin basina bir 'cakal kullanici login olmadan mi buraya gelmeye cali$iyor' kontrolu eklemek gereklidir. Bu da tabii ki copy/paste kod demek. Daha kotusu eger copy/paste yapmayi unutursaniz kullanicilarin login olmadan eri$ebildikleri bir sayfa demek. Buna 'elegant' bir cozum olarak pmAQda kullandigim 'dispatcher' yontemi var. Ancak bu yontemin gercek $ikligini ortaya cikarmak icin, sayfalarinizin application logic kisiminin siniflar/fonksiyonlar olarak yazilmasi gerekli. Zaten MVC yapisinda bunun duzgun yapili$i boyledir. Eger JSON gibi bir yontemle data aliyorsaniz i$iniz daha da kolay olacaktir. Dispatcher'i aciklamadan once bu konuyu biraz daha netle$tirmem gerekli sanirim. Kolaylik acisindan JSON ile bir ornek verecegim:
index.php dosyasinda /backend/script.php dosyasina bir XHR yapildigini varsayalim. /backend/script.php dosyasinin en ba$inda kullanicinin session acip acmadiginin kontrolunun yapilmasi gerekli.
Yani takriben soyle bir kod olacaktir:

if (!isset($_SESSION["logged_in"]) redirect_to_error_page();
echo do_some_hede_and_output_json();
?>

bunun gibi bir suru script olunca, genelde arada kaynar bu session kontrolu, bunu engellemek icin ben dynamic class loading kullanarak dispatcher yonteminden faydalaniyorum, oda $oyle bi$i:
index.php'nin icinden /backend/dispatcher.php dosyasina XHR yapiliyor ve parametre olarak yuklenecek class isimi ve cagiracak metod isimi veriliyor. Yani XHR'in bagirsaklarina inersek soyle bir manzara ortaya cikacak:
http://mydomain/backend/dispatcher.php?object=someobject&method=somemethod
dispatcher.php nin yaptigida cok basit bir sekilde soyle olacaktir:

if (!isset($_SESSION["logged_in"]) redirect_to_error_page();
require_once($_GET["object"]."class.php");
$a = new $_GET["object"];
$a->$_GET["method"];
?>

vede asil i$lemleri yapan someobject.class.php dosyasi var:

class someobject {
function somemethod()
{
echo do_some_hede_and_output_json();
}
}
?>

Bu class dosyalarinin direkt URL ile acmaya cali$an biri direkt bos ekran gorecektir, eger cok paranoyaksaniz
webden ula$ima kapali bir yerlere de ta$iyabilirsiniz. Boylece hem scriptlerinizi daha derli toplu tutabilirsiniz,
hemde session control i$ini her seferinde hatirlamak gibi bi derdiniz kalmayacaktir.

Hiç yorum yok: