Php İle Kullanıcı Oturum Kontrol Nesnesi - oKoN

Hem işlerimde kullanabileceğim hem de diğer insanların kullanabileceği açık kaynak bir içerik yönetim sistemi geliştiriyorum(minipo-minik portal gibi bir isim buldum ama alan adı alınmış, yeni şeyler keşfetmek gerekecek). Bu sistem için bir oturum kontrol nesnesi geliştirdim. Eğer özel sayfalar oluşturup rumuz ve/veya parola ile kullanıcılarınızın o sayfalara erişilebilmesini istiyorsanız, oturum kontrol nesnesini sisteminize basitçe adapte edebiliyorsunuz.

Bir süre(uzun bir süre) önce geliştirdiğim koruma projesinin aslında gelişmiş bir türevi. Koruma projesinde hesaplar.php dosyasından hesaplar alınıyordu. Veritabanı işlemleri yoktu. Gerçi koruma 0.3 sürümü hazırda bekliyor. Kodlar gözden geçirilecek. 0.3 sürümünde kullanıcı yönetimi mevcut. Belki koruma 0.3 bu olacak vs. Her neyse :) Bu geliştirilen oturum kontrol nesnesi hem korumadan daha kolay sisteminize adapte edilebilecek türden hem de ayarları ile daha kapsamlı bir şekilde özelleştirilebilecek bir yapıda.

Phpde çok iyi olduğum söylenemez. Ondan eksikler çok olabilir. Üzerinde biraz daha zaman harcamam gerekiyor. Henüz istediğim seviyede değil. Kodları kullanabilmek için ilk olarak bir veritabanı ve üye bilgilerinin bulunacağı bir tablo oluşturmalısınız. Aşağıda mysql için örnek kodlar mevcut:

Veritabanı ve tablo oluşturup rumuz ve parolası "deneme" olan bir kullanıcıyı tabloya ekleyen sql kodları.

 
CREATE DATABASE panel;
USE panel;
CREATE TABLE uyeler(
 
    uyeNo       int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 
    rumuz       varchar(20) NOT NULL,
 
    parola      varchar(32) NOT NULL,
 
    PRIMARY KEY (uyeNo)
 
);
INSERT INTO uyeler(rumuz,parola) VALUES("deneme","8f10d078b2799206cfe914b32cc6a5e9");

8f10d078b2799206cfe914b32cc6a5e9 "deneme" ifadesinin md5 ile şifrelenmiş halidir.

test.class.oturum.kontrol.php içeriği:

 
< ?php
/*
oKoN - test
 
Size özel sayfalara ve/veya kullanıcıların bir rumuz ve/veya parola ile giriş
yapmasını istediğiniz sayfalara kolayca adapte edebileceğiniz
veritabanı ile etkileşimli php ile geliştirilmiş bir kullanıcı oturum kontrol nesnesi.
 
Copyright (C) {2006} {Ömer Ücel}
 
omerucel@gmail.com
http://www.omerucel.com/
 
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
 
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License along with
this library; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA
*/
 
/*
-------------
- Uyarılar  -
-------------
# session_start(), session özelliği kullanılacaksa, sisteminizin başlangıcına yerleştirilmelidir.
 
# Session(OK_SOD=true) ya da Cookie(OK_COD=true) özelliklerinden birisi mutlaka açık olmalıdır.
 
*/
 
// Oturum kontrolü için kullanılacak tablo.
define("OK_TBL","uyeler");
 
// Tablo içerisinde kullanılacak sütunlar.
$ok_sutunlar = array(
                // "sütun tanımı" => "sütun adı"
                "uye_no"   => "uyeNo",
                "rumuz"    => "rumuz",
                "parola"   => "parola"
                );
 
// Rumuz kontrolü yapılsın mı? true yapar.
define("OK_RKO",true);
 
// Parola kontrolü yapılsın mı ? true yapar.
define("OK_PKO",true);
 
// Yakında eklenecek. <img src='http://omerucel.com/gunluk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
// Son giriş özelliği çalıştırılsın mı? true çalıştırır.
define("OK_SGI",true);
 
// Yakında eklenecek. <img src='http://omerucel.com/gunluk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />
// Son ip özelliği çalıştırılsın mı? true çalıştırır.
define("OK_SIP",true);
 
// Session özelliği kullanılsın mı? true kullanır.
define("OK_SOD",true);
 
// Cookie özelliği kullanılsın mı? true kullanır.
define("OK_COD",true);
 
// Session veya Cookielerin çakışmamasını sağlar. Boş bırakılabilir.
define("OK_KID","test");
 
// Rumuz için regex kontrol cümlesi. Öntanımlı değer, küçük harfler, büyük harfler ve rakamları kabul eder.
define("OK_RRX","[^a-zA-Z0-9]");
 
// Parola için regex kontrol cümlesi. Öntanımlı değer küçük harfler, büyük harfler ve rakamları kabul eder.
define("OK_PRX","[^a-zA-Z0-9]");
 
// Cookie için zaman aşım değeri. Öntanımlı değer 1 saat.
define("OK_ZAS",time() + 3600);
 
class OturumKontrol{
    private $sonuc;         // Sorgulama sonuçları için kullanılan değişken.
    private $tablo;         // Kullanıcıların bulunduğu tablo değerini tutan değişken.
    private $rumuz;         // Parola değişkeni.
    private $parola;        // Rumuz değişkeni.
    private $sutunlar;      // Sütun değerlerini tutan değişken.
    private $sutunlar_lst;  // Sütun listesini tutan değişken.
    public  $durum;         // Kontrol durumu.
    public  $devam;         // Kontrol işlemi başlama durumu.
    public  $msj;           // Kontrol işlemleri sonucunda bazı mesajları tutan değişken.
 
    // Nesne tanımlandığında otomatik çalışan fonksiyon.
    public function __construct(){
        global $ok_sutunlar;
 
        $this->tablo        = OK_TBL;
        $this->rumuz        = "";
        $this->parola       = "";
        $this->durum        = false;
        $this->devam        = false;
        $this->sutunlar_lst = $ok_sutunlar;
        $this->sutunlar     = "";
        $this->msj          = "";
 
        // Sütunlar listesi kullanılarak, sütun değerleri alınıyor.
        foreach ($this->sutunlar_lst as $key => $value){
            $this->sutunlar.= $value.",";
        }
        // Son virgül ayıklanıyor.
        $this->sutunlar     = substr($this->sutunlar,0,-1);
 
        // Form kontrol işlemleri
        $this->kontrol_form();
        if (OK_SOD==true)
            $this->kontrol_session();
        if (OK_COD==true)
            $this->kontrol_cookie();
 
        if (OK_RKO==true && OK_PKO==false && !empty($this->rumuz))
            $this->devam = true;
 
        if (OK_RKO==false && OK_PKO==true && !empty($this->parola))
            $this->devam = true;
 
        if (OK_RKO==true && OK_PKO==true && !empty($this->rumuz) && !empty($this->parola))
            $this->devam = true;
 
        if ($this->devam == true)
            $this->oturum_kontrol();
    }
 
    private function temizle($reg,$text){
        return ereg_replace($reg,"",$text);
    }
 
    // Form kontrolünü yapan fonksiyon.
    private function kontrol_form(){
        // Form rumuz kontrol
        if (isset($_POST["rumuz"]) && OK_RKO==true){
            $this->rumuz  = $this->temizle(OK_RRX,$_POST["rumuz"]);
            if (empty($this->rumuz)){
                if (empty($this->msj))
                    $this->msj = "Rumuz alanı boş kalmamalı.";
            }
        }
 
        // Form parola kontrol
        if (isset($_POST["parola"]) && OK_PKO==true){
            $this->parola  = $this->temizle(OK_PRX,$_POST["parola"]);
            if (empty($this->parola)){
                if (empty($this->msj))
                    $this->msj = "Parola alanı boş kalmamalı.";
            }else{
                $this->parola = md5($this->parola);
            }
        }
    }
 
    // Session kontrolünü yapan fonksiyon.
    private function kontrol_session(){
        // Session rumuz kontrolü
        if (!isset($_POST["rumuz"]) && OK_RKO==true){
            if (isset($_SESSION[OK_KID."rumuz"])){
                $this->rumuz  = $this->temizle(OK_RRX,$_SESSION[OK_KID."rumuz"]);
            }
        }
 
        // Session parola kontrolü
        if (!isset($_POST["parola"]) && OK_PKO==true){
            if (isset($_SESSION[OK_KID."parola"])){
                $this->parola  = $this->temizle(OK_PRX,$_SESSION[OK_KID."parola"]);
            }
        }
 
        // Diğer sütunların session atamaları yapılıyor.
        foreach ($this->sutunlar_lst as $key => $value){
            if (!isset($_SESSION[OK_KID.$key]))
                $_SESSION[OK_KID.$key] = "";
        }
    }
 
    // Cookie kontrolünü yapan fonksiyon.
    private function kontrol_cookie(){
        // Cookie rumuz kontrolü
        if (!isset($_SESSION[OK_KID."rumuz"]) && OK_RKO==true && isset($_COOKIE[OK_KID."rumuz"])){
            $this->rumuz  = $this->temizle(OK_RRX,$_COOKIE[OK_KID."rumuz"]);
        }
 
        // Cookie parola kontrolü
        if (!isset($_SESSION[OK_KID."parola"]) && OK_PKO==true && isset($_COOKIE[OK_KID."parola"])){
            $this->parola  = $this->temizle(OK_PRX,$_COOKIE[OK_KID."parola"]);
        }
    }
 
    // Oturum açma işlemini kontrol eden fonksiyon.
    private function oturum_kontrol(){
        $this->sonuc = mysql_query("Select ".$this->sutunlar." from ".$this->tablo." Where ".$this->sutunlar_lst["rumuz"]."='".$this->rumuz."' and ".$this->sutunlar_lst["parola"]."='".$this->parola."'");
        $result = mysql_fetch_assoc($this->sonuc);
        if ($result[$this->sutunlar_lst["uye_no"]]>0){
            // Sütun değerlerinin sessionlara aktarımı yapılıyor.
            if (OK_SOD==true){
                foreach ($this->sutunlar_lst as $key => $value){
                    $_SESSION[OK_KID.$key] = $result[$value];
                }
            }
 
            // Sütun değerlerinin "cookie"lere aktarımı yapılıyor.
            if (OK_SOD==true){
                foreach ($this->sutunlar_lst as $key => $value){
                    setcookie(OK_KID.$key,$value, OK_ZAS);
                }
            }
 
            $this->durum = true;
        }else{
            //Forum kullanılmışsa, rumuz veya parolada boş değilse
            if ((isset($_POST["rumuz"]) || isset($_POST["parola"])) && (!empty($_POST["rumuz"]) || !empty($_POST["parola"]))){
                if (empty($this->msj))
                    $this->msj="Rumuz veya parola hatalı.";
            }
            // Durum olumsuz olduğu için oturum kapatma işlemi çalıştırılıyor.
            $this->oturum_kapat();
        }
    }
 
    // Oturum açma durumu olumsuz ise ya da oturum kapatma işlemi gerçekleşirse çağrılan fonksiyon.
    // Kısacası temizlik yapar kendisi.
    public function oturum_kapat(){
 
        // Session değerleri temizleniyor.
        if (OK_SOD==true){
            foreach ($this->sutunlar_lst as $key => $value){
                $_SESSION[OK_KID.$key] = "";
            }
        }
 
        // Cookie değerleri temizleniyor.
        if (OK_SOD==true){
            foreach ($this->sutunlar_lst as $key => $value){
                setcookie(OK_KID.$key,$value, time() - 3600);
            }
        }
 
        $this->durum = false;
    }
}
 
?>
 

test_oturum_kontrol.php içeriği:

 
< ?php
// Bu kodu sisteminizde sayfanın en üst kısmına yerleştirmelisiniz.
session_start();
 
// Oturum Kontrol Nesnesi kullanımına dair örnek bir sayfa.
 
// Burada veritabanı bağlantı işlemleri yapılıyor.
$vt = mysql_connect("localhost", "veritabanı kullanıcı adı", "veritabanı kullanıcı şifresi");
mysql_select_db("veritabanı adı",$vt);
 
// İşlem değişkeni oturumu kapatma işlemini alıyor.
if (isset($_GET["i"])){
    $islem = $_GET["i"];
}else{
    $islem = "";
}
 
// Nesnemizi sayfamıza ekliyoruz.
require_once("test.class.oturum.kontrol.php");
 
// Nesnemizi kullanabilmemiz için onu bir değişkene atıyoruz.
$ok = new OturumKontrol();
 
// İşlem değişkeni oturumu_kapat değerine sahipse nesne içindeki oturumu kapatma fonksiyonu çağrılıyor.
if ($islem == "oturumu_kapat")
    $ok->oturum_kapat();
 
// Oturum açılmışsa kullanıcı karşılanıyor
// açılmamışsa giriş formu görüntüleniyor.
if ($ok->durum == true){
    echo "Merhaba şu anda <strong>".$_SESSION[OK_KID."rumuz"]."</strong> kullanıcı adı ile oturum açmış durumdasınız.";
    echo "<a href=\"test_oturum_kontrol.php?i=oturumu_kapat\">Oturumu Kapat</a>";
}else{
    ?>
<form id="form" method="post" action="test_oturum_kontrol.php">
<div>
            < ?php if(!empty($ok->msj)) echo $ok->msj.""; ?>
            <label>Rumuz:</label>
<input type="text" name="rumuz" value="" style="margin:5px 0 5px 0;width:200px;" />
            <label>Parola:</label>
<input type="password" name="parola" value=""  style="margin:5px 0 5px 0;width:200px;" />
<input type="submit" value="Oturum Aç" />
        </div>
</form>
 
    < ?php
}
 
// Değişkeni yok ediyoruz.
unset($ok);
 
// Veritabanı bağlantısını kapatıyor ve değişkeni yok ediyoruz.
mysql_close($vt);
unset($vt);
?>
 

Tags:

Leave a Reply