Anasayfa » Codeigniter, Php

Codeigniter Dersleri – 21 – Yönetici Girişi ve Yönetici Alanı – Session

20 Ağustos 2011 11.498 kez okundu 14 yorum
1 Star2 Stars3 Stars4 Stars5 Stars (4 oy,5 üzerinden : 4,75 )
Loading...

Herkese tekrar merhabalar, uzun bir aradan sonra bugün bir dersle daha sizlerleyim. Bugünkü dersimiz yine klasik codeigniter derslerinden olacak. Bahsedeceğimiz konu ise, kullanıcı giriş yapılabilecek bir giriş paneli, ancak giriş yapıldıktan sonra erişilebilecek bir kullanıcı veya yönetici alanı ve yeni kullanıcı kaydı. Ayrıca bu dersimizde sizlere session lardan bahsedeceğim.

İlk olarak size projenin bir kaç ekran görüntüsünü vereyim.

Giriş Panelimiz.

Kayıt panelimiz

İlk olarak view dosyamızı hazırlayalım, Bu dersimizde yine view dosyamız dinamik olacak ve header,footer ve main_content(ana kısım) bulunacak. Bunun için view klasörü altında includes adında bir klasör oluşturuyoruz ve içerisine footer.php, header.php, ve template.php adında 3 dosya oluşturuyoruz.

Template.php dosyamızın içerisi şu şekilde olacak.

1
2
3
<?php $this->load->view('includes/header');?>
<?php $this->load->view($main_content);?>//Dinamik olarak main_contenti yükleyeceğiz ve her sayfamızda aynı footer ve headerla karşılaşarak genel bir şablon hazırlamış olacağız.Yani burada login.php olabilir, signup.php olabilir...
<?php $this->load->view('includes/footer');?>

Header ve footer dosyalarımıza ise klasik html kodlarını koyacağız. Header.php dosyamız şu şekilde,

1
2
3
4
5
6
7
8
9
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>KodMerkezi.Net</title>
<link rel="stylesheet" href="<?php echo base_url();?>css/style.css" type="text/css" media="screen" charset="utf-8">
</head>
 
<body>

ve footer.php dosyamızda şu şekilde olacak.

1
2
</body>
</html>

header dosyamızda bulunan aşağıdaki kodu biraz açalım

1
<link rel="stylesheet" href="<?php echo base_url();?>css/style.css" type="text/css" media="screen" charset="utf-8">

Şimdi burada bütün sayfalarda geçerli olacak bir css dosyasını projeye dahil ediyoruz. “echo base_url();” ile daha sonra belirleyeceğimiz projenin ana dizinine ulaşmış oluyoruz ve bu dizin altında bir css klasörü ve içerisinde style.css adında dosyamız olacak.

template.php dosyamızda footer ve header arasına main_content değişkenini koyarak, bu sayfayı controller dosyamızdan dinamik olarak yönetmeye çalışacağız. Yani hazırladığımız bütün sayfalar aynı şablonda olacak.

Ana şablonu hazırladıktan sonra şimdi geldi sıra login sayfamızı hazırlamaya, bunun için öncelikle login controllerini hazırlamamız lazım. İlk açılacak sayfa login sayfamız olması lazım. Bunun için şimdi controller altında login.php adında bir dosya oluşturuyoruz ve şu şekilde kodluyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class Login extends CI_Controller
{
	function __construct()
	{
		parent::__construct();
	}
	function index()
	{
		$data['main_content'] = 'login_form';//açılışta ilk olarak login sayfamız görünecek bu yüzden main_content i login forma eşitliyoruz
		$this->load->view('includes/template',$data);//view dosyamızı yüklüyoruz.
	}
}
?>

Manuel olarak bu dosyayı yükledik ancak yüklediğimiz login_form.php dosyasını oluşturmadık. Gelin şimdi bu dosyayı oluşturalım.

Hemen klasik bir form oluşturuyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
<div id="login_form"><!--id olarak login_form diyoruz ki daha sonra hazırlayacağımız css dosyasıyla burayı düzenleyebilelim-->
	<h1> Giriş!</h1>
 
	<?php
 
		echo form_open('login/validate_credentials');//Submit edildiğinde login.php altındaki validate_credentials fonksiyonu çağrılacak ve kullanıcının doğruluğunu kontrol edecek.
		echo form_input('username','Kullanıcı Adı');//Kullanıcı Adı Alanı
		echo form_password('password','Şifre');//Password Alanı
		echo form_submit('submit','Giriş');//Giriş Butonu
		echo anchor('login/signup','Yeni Kayıt');//Yeni Kullanıcı Kayıt Butonu
 
	?>
</div>

Giriş yapıldığında kullanıcıyı kontrol edecek bir fonksiyon hazırlamamız gerekiyor, bunu controller dosyamız olan login.php içinde hallediyoruz. Aşağıdaki şekilde bir fonksiyonu login.php dosyamıza ekliyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function validate_credentials()
	{
		$this->load->model('membership_model');//model dosyamızı yükledik. Database işlemleri burada gerçekleşiyor.
		$query = $this->membership_model->validate();//Kullanıcıyı model dosyamız içerisindeki validate() fonksiyonu ile kontrol ediyoruz.
 
		if($query)//Kullanıcı var ise bir sezon oluşturmamız gerekiyor.
		{
			//sezonu oluşturmak için biraz veri hazırlıyoruz. Bu veride giriş yapan kullanıcının kullanıcı kaydı ve giriş yapıldığını gösteren logged_in değişkeni bulunuyor.
			$data = array(
				'username' =>$this->input->post('username'),//kullanıcı ismini formdan alarak yazıyoruz.
				'is_logged_in' =>true//giriş yaptığı için true değerini ekliyoruz.
			);
 
			$this->session->set_userdata($data);//set_userdata yeni bir session oluşturur.
			redirect('site/members_area');//yeniden yönlendirme yaparak members_area bölümünü açıyoruz.
 
		}
		else//böyle bir kullanıcı yoksa anasayfaya yönleniyoruz.
		{
			$this->index();
		}
	}

Tamam fonksiyonumuzu login.php içerisine kaydettik ama oradak çağırdığımız model dosyamızı hala oluşturmadık. Hemen models klasörü altına membership_model.php adında bir dosya oluşturup içerisine validate() fonksiyonunu yazıyoruz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class Membership_model extends CI_Model{
 
	function validate()
	{
		$this->db->where('username',$this->input->post('username'));//bu method ile username değeri formdaki username ile eşleşen,
		$this->db->where('password',md5($this->input->post('password')));//password değeri formdaki password field ile eşleşen satırları,
		$query = $this->db->get('membership');//membership tablosundan çekiyoruz.
 
		if($query->num_rows == 1)//Dönen değerin satır sayısı(yani kullanıcı sayısı) 1 ise formdaki değerler ile eşleşen bir kullanıcı mevcut demektir.Eğer birden fazla çıkıyorsa aynı kullancıı iki kere kaydedilmiş demektir. Yok 0 çıkıyor ise de böyle bir kullanıcı yok demektir.
		{
			return true;//kullanıcının başarılı giriş yaptığını varsayarak true döndürüyoruz.
		}
	}
 
}
 
?>

Hemen bir not düşeyim, normalde database fonksiyonlarını kullanabilmek için database kütüphanesini yüklememiz gerekiyordu, aynı şey session içinde geçerli . Bu library leri ister fonksiyonları kullandığımız yerde load ederiz, istersek benim şimdi yapacağım gibi autoload.php dosyamızdan otomatik load ederiz. Yukarıdaki fonksiyonu model dosyamıza ekledikten sonra gelin şimdi autolaod.php dosyamızı düzenleyelim. application/config/autoload.php dosyamızı açalım ve şu satırı bulalım

1
$autoload['libraries'] = array();

ve bu satırı şu şekilde düzenleyelim

1
$autoload['libraries'] = array('session','database');

Bu şekilde database ve session kütüphanelerini otomatik yüklemiş olduk. Session kütüphanesi yüklediğimizde kullanabilmek için config.php dosyamızda bulunan encryption_key ‘ e bir değer vermemiz gerekiyor.

İlk olarak application/config/config.php dosyamızda şu satırı buluyoruz.

1
$config['encryption_key'] = '';

ve burada kendimize göre bir key belirleyip tırnakların arasına yazıyoruz.

Hazır autoload.php den söz açılmışken, url ve formları oluştururken lazım olan helperlarıda yükleyelim.

autoload.php içerisinde şu satırı bulalım.

1
$autoload['helper'] = array();

ve şu şekilde değiştirelim.

1
$autoload['helper'] = array('url','form');

İnce ayarları da yaptıktan sonra gelin birde databaseimizi hazırlayalım.

membership adında bir tablo oluşturalım 6 alanlık. İsimleri ve türleri şu şekilde olsun.

id – int(11) auto_increment
firstname – varchar(25)
lastname – varchar(25)
username – varchar(25)
password – varchar(32)
email  – varchar(50)

password türümüzün uzunluğu 32 olacak. Çünkü şifreyi md5 şifreleme yöntemi ile kaydedeceğiz ve bu yöntemde oluşan hash kodları her zaman 32 bit uzunluğundadır.

Konu biraz dağıldı gibi, hemen toparlıyorum. Şimdi kullanıcı doğru giriş yaptığında validate_credentials() fonksiyonunda da görüldüğü gibi members_area.php dosyasına yönlenecek. Bu dosyayıda hazırlayalım. Views klasörü altına members_area.php dosyasını oluşturalım ve şu şekilde dolduralım.

1
<p>members area only!<?php echo anchor('login/logout', '  Cikis');?></p>

Burada gördüğünüz gibi birde logout butonu var. Bunuda çıkış yapmak için kullanacağız ve işlevi sessionu silmek olacak. login.php içine logout() fonksiyonun oluşturuyoruz ve şu şekilde kodluyoruz.

1
2
3
4
5
6
function logout()
	{
		$this->session->sess_destroy();//bütün sessionları siler
		$data['main_content'] = 'login_form';//tekrar login sayfasına yönleniyoruz
		$this->load->view('includes/template',$data);
	}

Aslında şu ana kadar sezonun(session) nimetlerinden faydalanamadık. Neden derseniz, eğer adres çubuğuna
http://localhost/CodeIgniter_2.0.2/index.php/site/members_area
yazar ve gidersek members area ya erişmiş olacağız. Halbuki giriş yapmamız gerekiyordu. İşte aslında bu sayfaya her erişilmek istendiğinde giriş yapmış kullanıcı varmı diye kontrol etmemiz gerekiyor. Ve burada devreye sezonlar (ya da oturumlar) giriyor.

Şimdi hem diğer bir controller dosyamız olan site.php dosyamızı hazırlayacağız hem de oturum kontrolü gerçekleştireceğiz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
class Site extends CI_Controller
{
	function __construct()//site classı her çağrıldığında otomatik çalışan fonksiyon
	{
		parent::__construct();
		$this->is_logged_in();//members_area her çağrıldığında öncelikle bu fonksiyon çalışacak
	}
	function members_area()
	{
		$this->load->view('members_area');
	}
	function is_logged_in()//giriş yapmış kullanıcı var ise members_area erişimine izin verecek aksi halde engelleyecek.
	{
		$is_logged_in = $this->session->userdata('is_logged_in');//Burada oturumdan is_logged_in değerini çekiyoruz. Eğer true dönerse bir kullanıcı giriş yapmış demektir.
 
		if(!isset($is_logged_in) || $is_logged_in != true)//is_logged_in set edilmiş mi ve set edildi ise değeri true mu? Cevabımız evet ise bu fonksiyon bir problem çıkarmıyor ve yolumuza devam edip sayfamıza erişiyoruz.
		{
			echo 'Bu sayfaya eriim yetkiniz yok <a href="../login">Giri</a>';//Aksi halde erişim yok uyarısı verip,
			die();//işlemi durduruyoruz.
		}
	}
}
?>

Bunu da yaptıktan sonra çıkış yapmış bir kullanıcı direk olarak members_area ya erişemeyecek.

Bu arada session kaydetmeyi gördük, bütün sessionları silmeyi de logout fonksiyonunda gördük, peki tek bir sessionu silmek istersek ne yapacağız.

O zaman set_userdata yerine unset_userdata kullanacağız.

1
$this->session->unset_userdata('some_name');

Buraya kadar login logout işlemleri session işlemleri yetkisiz erişim işlemlerini tamamladık. Bir sonraki dersimde yeni kullanıcı kaydı gerçekleştirip, css dosyamızı hazırlayacağız. İyi günler…

<<< Önceki:

Sonraki: >>>


Facebookta Paylaş

14 yorum »

  • Memo dedi ki:

    Hocam merak ettigim birsey var Cikis yaptigimizda tekrar linki yazdigimda sayfa aciliyor Cookiesleri sildim denedim yine acildi bunu nasil engellerim.

  • Gürcan Kavakçı dedi ki:

    site.php dosyasını benim yukarıda yazdığım gibi yazdınız mı, yani construct içinde is_logged_in() fonksiyonu çağrılıyor mu. Bu fonksiyon o sayfaya erişilmek istendiğinde login olmuş kullanıcı varmı diye kontrol ediyor.

  • Memo dedi ki:

    sagolun hocam

  • Tugce dedi ki:

    Merhaba.Çok faydalı bir konu teşekkür ederim.
    Size sormak istediğim soru,bu yaptığımız kodla sınırlamak istediğimiz sayfalara is_logged_in() fonksiyonunu koyarsak çalışır mı bunu mera etmiştim.teşekkürler.

  • Gürcan Kavakçı dedi ki:

    Site.php içerisinden çağrılan bütün sayfalarda otomatik olarak is_logged_in() kontrolü yapılmaktadır. Ancak siz bu fonksiyonu direk view dosyası içerisinden çağırmak istiyorsanız, bunu library ile halletmeniz gerekecek.

  • Tugce dedi ki:

    Teşekkür ederim daha iyi anladım.Çok anlaşılabilir bir örnek olmuş sağolun.

  • ahmet dedi ki:

    üstad anlatım için saolasın emeğine sağlık. ben şunu merak ediyorum : sıradan bir site için bu framework yapısını ( codeigniter ) kullanmamın bana normal kullanımdan bir artısı olacak mıdır? yoksa sadece işi karmaşık hale mi getirmiş olacağım.

  • admin dedi ki:

    Merhaba Ahmet,
    Normal siteden kastın nedir? Eğer çok iyi bir şekilde framework yapısını kavradıysanız, karmaşıklık size uzak bir terimse her türlü projede kullanabilirsiniz. Sonuçta iyi bildiğiniz için zaman kaybı yaşatmaz. Ancak static siteler için, yani içeriği çok değişken olmayan siteler için kullanmanın anlamı olduğunu söyleyemem. Örneğin bir firma tanıtım sitesi için frameworke gerek yoktur. Zaten bir kere yazarsınız çok değişiklik gerektirmez. Ancak içeriği değişken dinamik siteler için kullanmanız her türlü fayda sağlayacaktır. En önemlisi de güvenliktir. Bunların hepsini dikkate aldığımızda bu sorunun cevabı biraz size bağlıdır.

  • ihsan dedi ki:

    Çok hoş bir anlatım öncelikle teşekkürler…

    Umarım anladığım nokta şu ; membership area ya direk yol yazıldığında ulaşamıyor çünkü redirect ile site controller ına gönderiliyor ve bu sayfa şifre girilmemişse atıyor.(umarım doğru anlamışımdır.. :))
    Burda takıldığım nokta şu :
    members alanımız birden fazla sayfadan oluşuyorsa hepsini site controllerına mı redirect etmek gerekecek.
    view klasörümde 5-6 sayfam daha var .. ki onlaraa veri tabanından belli verileri çekerek direkt gönderiyordum.. umarım problemimi anlatabildim..

  • admin dedi ki:

    İhsan,

    İzinsiz erişimleri engellemek için, bu kontrolün yapılması gerekmektedir. Site controllerını kullandığınızda bu işlem constructor içinde otomatik olarak yapılmaktadır. Farklı bir controller kullanırsanız onun constructor ınada yazmanız gerekmektedir.

  • erkan dedi ki:

    Merhaba

    form validate fonksiyonu localhostta çalışıyor fakat hostinge attığımızda şu hatayı veriyor :

    A PHP Error was encountered

    Severity: Notice

    Message: Trying to get property of non-object

    Filename: models/membership_model.php

    Line Number: 12

    bu hatanın sebebi ne olabilir .?

  • ahmet dedi ki:

    merhaba;
    derslerinizi okurken şunu farkettim, view içinde de sıkça framework ün sunduğu fonksiyonlar kullanılıyor. tasarımın farklı frameworklere taşınabilmesini mümkün kılmak istersek bu durum sorun çıkarır mı?

  • Mehmet dedi ki:

    Hocam benim pcde database oluşmadı veritabanı ismi ne oluyodu

  • muzaffer şenkal dedi ki:

    Malesef giriş yapmıyor. sebebi ise model dosyasındak
    $query->num_rows
    şeklinde yazılmıs şu şekilde düzeltirsek çalısacaktır.
    $query->num_rows()

Yorum Bırakın!

Yorum yaz, yada kendi sitende trackback (Geri besleme) olarak ekle. Ayrıca RSS ile bu konuya üye olabilirsin. .

Nazik olun. Temiz tutun. Konu dışına çıkmayın. Spam yaratmayın.

Bu tagları kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bloğumuz gavatarı desteklemektedir. Kendi gavatarınızı edinmek için lütfen Gravatar a üye olun.