Membuat Website dengan CodeIgniter #4

Sep 27, 2009   //   by anggie   //   CodeIgniter, PHP  //  90 Comments

Dalam seri tutorial kali ini, kita akan membuat sistem user authentification. Kita akan membahas pembuatan sistem login multi user (level) dan bagaimana mengatasi validasinya di setiap halaman-halaman penting. Sistem authentification ini sangat berguna di dalam pembuatan aplikasi web yang digunakan oleh user yang lebih dari satu. Perlu saya sampaikan disini bahwa sistem yang akan kita buat merupakan ‘basic concept’ saja. Artinya, pada kenyataannya, security perlu Anda tingkatkan.
Oke kita mulai. Hal pertama yang perlu kita siapkan adalah tabel dalam database kita. Kita akan memerlukan dua tabel untuk hal ini, yakni tabel user, level, dan menu. Berikut sql query-nya.

CREATE TABLE IF NOT EXISTS `user` (
  `user_id` int(5) NOT NULL auto_increment,
  `user_nama` varchar(50) NOT NULL,
  `level_id` int(1) NOT NULL,
  `user_username` varchar(30) NOT NULL,
  `user_password` varchar(200) NOT NULL,
  PRIMARY KEY  (`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
INSERT INTO `user` (`user_id`, `user_nama`,`level_id`,`user_username`,`user_password`) VALUES
(1, 'Joko','1','jack',PASSWORD('jacktampan'),
(2, 'Ridwan','2','ridone',PASSWORD('alahmak'),
(3, 'Asep','1','darkfog',PASSWORD('darknessforever');
CREATE TABLE IF NOT EXISTS `level` (
  `level_id` int(1) NOT NULL auto_increment,
  `level_nama` varchar(30) NOT NULL,
  PRIMARY KEY  (`level_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
INSERT INTO `level` (`level_id`, `level_nama`) VALUES
(1, 'admin'),
(2, 'guru'),
(3, 'siswa');
CREATE TABLE IF NOT EXISTS `menu` (
  `menu_id` int(3) NOT NULL auto_increment,
  `menu_nama` varchar(30) NOT NULL,
  `menu_level` varchar(100) NOT NULL,
  PRIMARY KEY  (`menu_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;
INSERT INTO `menu` (`menu_id`, `menu_nama`,`menu_level`) VALUES
(1, 'Manajemen Menu','1'),
(2, 'Posting Berita','1+2'),
(3, 'Lihat Nilai','1+2+3');

Konsepnya adalah sebagai berikut :

  1. Tabel user menyimpan data user. Field penting yang terkait dengan sistem adalah level_id. Dengan level_id, kita dapat mengetahui level dari si user tersebut. Dalam contoh kita, kita sudah masukkan tiga orang user, masing masing level satu orang.
  2. Tabel level menyimpan referensi level dan namanya. Sebenarnya ini optional, tetapi akan sangat berguna untuk kerapihan struktur sistem. Dalam contoh kita, kita masukkan tiga level.
  3. Tabel menu menyimpan ‘sistem menu’ di dalam aplikasi yang kita buat. Disarankan dalam membuat controller grup admin (controller yang berisi fungsi pengolah halaman-halaman admin), supaya dipisahkan per menu. Misalkan untuk contoh ini, kita perlu tiga controller, yaitu controller ‘manajemen_menu’, ‘posting_berita’, dan ‘lihat_nilai’. Field menu_level disini mungkin agak aneh, tapi ini cukup untuk menyimpan referensi ‘siapa sajakah yang boleh membuka menu yang bersangkutan’. Misalkan disini,menu posting berita hanya boleh dibuka oleh level 1 dan 2 (dipisah dengan tanda ‘+’), tidak lain adalah level admin dan level guru. Begitu pula dengan yang lainnya.

Berikutnya, kita buat library untuk memudahkan pengelolaan user, seperti login dan restrict page.


if (!defined('BASEPATH')) exit('No direct script access allowed');
class Auth {
 function Auth()
 {
    $this->CI =& get_instance();
 }
 function process_login($login = NULL)
 {
    // cek apakah array login ada
    // array login dikirim dari form login berisi username dan password

    if(!isset($login))
        return FALSE;   
    // value dalam array hanya boleh ada 2

    // tidak lebih dan tidak kurang

    if(count($login) != 2)
        return FALSE;  
    // ambil data dari array

    $username = $login['username'];
    $password = $login['password'];
    // cari dalam database
    $this->CI->db->where('user_username', $username);
    $this->CI->db->where("user_password=PASSWORD('$password')");
    $query = $this->CI->db->get('user');
    if ($query->num_rows() == 1)
    {
        foreach ($query->result() as $row)
        {
            $user_id  = $row->user_id;
            $username = $row->user_username;
            $level   = $row->level_id;
            $nama   = $row->user_nama;
        }
        $newdata = array(
            'user_id' => $user_id,
            'username'  => $username,
            'level'     => $level,
            'nama'    => $nama
        );
        $this->CI->session->set_userdata($newdata);
        // set session tambahan

        $this->CI->session->set_userdata('logged_user', $username);
        return TRUE;
    }
    else 
    {
        // No existing user.
        return FALSE;
    }
  }   
 function restrict($logged_out = FALSE)
 {
    // fungsi ini untuk mengatur restriction sebuah halaman

    if ($logged_out && $this->logged_in())
    {
        // jika user sudah login tetapi ingin melihat halaman
        // yang tidak seharusnya dilihat, contoh halaman login
        redirect('menu'); // url helper, pastikan sudah ter-load
    }
    if ( ! $logged_out && ! $this->logged_in())
    {
        // jika user sudah logout (default :FALSE) dan dia
        // ingin masuk halaman admin

        redirect('home');
    }
 }
 function logged_in()
 {
    if ($this->CI->session->userdata('logged_user') == FALSE)
    {
        return FALSE;
    }
    else 
    {
        return TRUE;
    }
 }
 function logout()
 {
    $this->CI->session->sess_destroy();
    return TRUE;
 }
 function cek($idmenu)
 {
    // untuk mengecek apakah user mempunyai hak akses atau tidak
    $status_user=$this->CI->session->userdata('level');
    $this->db->select('menu_level');
    $this->db->from('menu');
    $this->db->where('menu_id',$id);
    $data = $this->db->get();
    $row=$data->row();
    $lev=$row->menu_level;
    $arr=explode('+',$lev);
    if(in_array($status_user,$arr)==FALSE)
    {
        redirect('home');
    }
 }
}

Untuk menggunakannya kita terapkan dalam controller login sebagai berikut.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 
Class Login extends Controller
{
 function Login()
 {
    parent::Controller();
    $this->load->library('auth');
 }
 function login_form()
 {
    // restrict true agar user tidak bisa
    // melihat halaman ini ketika dia sudah login
    $this->auth->restrict(TRUE);
    $this->load->view('form_login');
 }
 function proses_login()
 {
    // ambil data dari form login, berisi username dan password
    $data_login = $_POST;
    $this->auth->process_login($data_login);
 }
 function logout()
 {
    $this->auth->restrict();
    $this->auth->logout();
    redirect('home');
 }
}

Selanjutnya, untuk setiap halaman yang akan dikontrol, kita cek dua kali, pertama cek apakah si user sudah login atau belum dan yang kedua cek apakah dia punya hak akses untuk melihat/membuka halaman tersebut. Pengecekan ini dilakukan di constructor dari controller (sehingga ber-efek ke semua fungsi dalam controller tersebut) menggunakan fungsi restrict() dan cek() yang sudah ada di paket library auth yang baru saja kita buat.


if (!defined('BASEPATH')) exit('No direct script access allowed');
Class Postingberita extends Controller
{
 function Postingberita()
 {
    parent::Controller();
    // cek apa dia sudah login
    $this->auth->restrict();
    // cek apa dia punya hak untuk mengakses menu posting berita (menu_id = 2)
    $this->auth->cek(2);
 }
}

OK kita selesai. Anda dapat membuat ‘panel manajemen menu’ jika anda memerlukannya. Lakukan update field menu_level dengan kombinasi level user dipisahkan dengan tanda ‘+’ (gunakan implode). Manajemen menu ini sangat perlu jika anda menginginkan menu Anda dinamis.

Feel free to comment. Good luck and happy coding!!

Related posts:

  1. Membuat Website dengan CodeIgniter #1
  2. Membuat Website dengan CodeIgniter #2
  3. Membuat Website dengan CodeIgniter #3
  4. Membuat Combobox Dinamis dengan CI dan Ajax
  5. Redirect dengan Delay Time di CodeIgniter

90 Comments

  • ok mas, tutorialnya bagus2 , kebetulan saya lagi pusing ma logout, sessionnya hilang tapi tetap bisa di back ?

    itu knapa ya mas ??

    saya sudah download filenya dr mediafire, mudah2an gk bisa nge back :D

    tarerengque

  • Sama-sama mas…^_^

  • @eky adhiputra : Memang bisa di back. Tp kalo di refresh pastinya tidak bisa lagi akses ke halaman tsb. Coba setelah logout, lakukan redirect halaman (lihat disini http://blog.putraweb.net/2009/09/27/redirect-dengan-delay-time-di-codeigniter/), agar orang lain tidak bisa back halaman tersebut. Cara yang lebih rumit, kunjungi http://www.boutell.com/newfaq/creating/backbutton.html

  • mas , saya udh download yg mycms, udh setting database n base url tapi kok ada error ya,

    bunyinya :

    Deprecated: Assigning the return value of new by reference is deprecated in C:\xampplite\htdocs\mycms\system\codeigniter\Common.php on line 123

    Deprecated: Assigning the return value of new by reference is deprecated in C:\xampplite\htdocs\mycms\system\codeigniter\Common.php on line 129

    A PHP Error was encountered

    Severity: 8192

    Message: Function set_magic_quotes_runtime() is deprecated

    Filename: codeigniter/CodeIgniter.php

    Line Number: 60

    Severity: 8192

    Message: Assigning the return value of new by reference is deprecated

    Filename: libraries/Loader.php

    Line Number: 248

    Severity: 8192

    Message: Assigning the return value of new by reference is deprecated

    Filename: database/DB.php

    Line Number: 133

    Severity: Warning

    Message: Cannot modify header information – headers already sent by (output started at C:\xampplite\htdocs\mycms\system\codeigniter\Common.php:123)

    Filename: libraries/Session.php

    Line Number: 315

    kenapa ya mas ??

  • oh ya, nanya lagi mas,
    tentang back itu, saya memakai yg facebook ala mas putra,

    setelah logout ketika di back, dia tidak bisa masuk k alamat admin lagi,

    bisa di jelaskan sedikit tentang file auth.php cz saya agak mudeng baca logikanya , maklum nubie :D

  • @eky : untuk error, itu karena mycms dibuat dengan versi CI 1.7.0, yang tidak kompatibel untuk PHP yang Anda punya (saya duga > 5.2). Jadi, replace smua file pada folder system/ (selain folder application tentunya) dengan file CI versi 1.7.3 (yang terbaru).

    File auth? Hampir sama dengan Class auth pada artikel ini. File itu hanya bertugas membuat session, menghancurkan, dan melakukan cek apakah user sudah login/belum (restrict).

  • Like This mas…!
    mohon ijin untuk saya share diblog saya,.,.,.!!!!

  • saya mengikutinya dari #1 – #4. bagus sekali tutorialnya, hanya klo boleh sedikit himbau. sertakan yang jelas mas bikin konsep tutorialnya, spt halnya mas membuat library untuk login spt diatas, kami ato saya khususnya tdk tau file itu saya simpan dimana, saya hanya menebak2 saja. sekali lagi mhn maaf dan trimakasih sudah share tutorial 1 – 4 bagus sekali… Good Job…..

    “semua berawal dari konsep” like this.

  • Thanks sarannya mas…masukan yang sangat bagus…

  • ya mas anggie, sama2… sekedar saran, maaf.. :)

  • ga salah kok mas…^^

  • gan ane tanya dunk, gk tau tanya di artikel ini salah pa bener hehe

    gini :

    ane kan aktifin urlsuffix .html untuk keperluan SEO, tapi kok pas pgn redirect , misal redirect(‘bukutamu’) hasilnya /bukutamu.html, ane coba cara laen redirect(‘bukutamu/index’) hasilnya /bukutamu/index.html knpa ya gan, semuanya gk jalan jd error 404,

    gmn cara benerrinnya ? tanpa menghapus urlsuffx .html

    kalau ane hapus urlsuffix baru jalan

    makasih :D

  • @Eky : coba periksa lagi controller bukutamu nya mas…setahu saya, url suffix hanya ‘embel-embel’ alias dia tidak akan mempengaruhi hasil tampilan/arah link…klo mas arahin browser ke http://server/bukutamu gmn?

  • kalau langsung http://localhost/web_ci/bukutamu bisa mas

    nah itu dia, klo redirect ke index / bukutamunya ada embel2 .html.

    kn d controller buku tamu ada fungsi input, jadi pas saya input, inginnya di tampilin langsung, otomatis harus balik lagi k bukutamu atau /bukutamu/index

    gmn ya ?? ada solusi lain selain redirect buat balik index ?

  • @Eky : saya masih blm mengerti, mas pengen redirect ke index, tapi ga mau ke bukutamu/index…? Sebenernya pengen ke fungsi apa? Index? Input?

  • gini mas, kalau redirect(‘bukutamu’) sepahaman saya, otomatis dia bakal ke fungsi pertama kali yaitu index walaupun penulisannya redirect(‘bukutamu’) atau bisa juga redirect(‘bukutamu/index’)

    nah di dalam fungsi index saya menampilkan isi buku tamu mas, saya ingin ke fungsi index,

    gitu mas, ane jga bingung kok ada embel2 .html ya, jadi redirectnya tidak , kalau mas coba pada saat urlsuffix nya .html , pas redirect ke fungsi lainnya pada controller yg sama ada .html gk ?

    maaf mas banyak nanya, nubi baru bljr CI hehe

  • kalau redirect(‘bukutamu/index’)

    di urlnya jadinya http://localhost/web_ci/bukutamu/index.html

    error 404 huhu

  • mas udh solved, ane akalin echo “”; tpi di urlny bukutamunya dobel jdi http://localhost/web_ci/bukutamu/bukutamu

    tpi gpp yg penting jalan hihihi

    mkasih mas, maaf ane banyak nanya :D

  • Oh…ya sudah, hehe

  • mas anggi, saya dateng lagi nih,… :d

    file_finalnya yg dah OK, dishare aja… bisa diunduh sama teman2 jadinya… :)

    -v-

  • @panega : ga ada mas…tu cuma comat comot dari aplikasi saya…jadi ga ada file jadi.

  • mas anggie,, itu ‘mycms’ downloadnya dimana ya..???

  • Coba http://www.mediafire.com/?wmzei2frz3c. Itu file lama mas. Jangan kaget klo banyak error :D

  • ganti filesystem ke CI yang baru

  • mas ane coba ternyata error di setiap baris yg ada “&amp” yah
    di baris2 ini:

    $this->CI =& get_instance();

    if ($logged_out && $this->logged_in())

    if ( ! $logged_out && ! $this->logged_in())

  • Iya mas…itu parsing wordpressnya gag beres…itu di ‘amp’ nya diilangin aja

  • bole tanya mas anggie..
    itu script yng d tulis d atas controller d simpan dimana ya? atau masuk dalam file controllerny?
    Jujur mas, sy br bbrp hr belajar CI, masi bingung sana sini…. Mohon masukkannya… thx

  • Auth diletakkan di library mas…application/libraries

  • assalamualaikum…. maaf mas mau tanya?
    apa website ini dibuat dengan framework codeigniter? atau mas punya web dengan frameworkyg lain?

  • Wa’alaikumsalaam. Blog ini pake wordpress mas…liat post” terbaru

  • mas..
    kenapa mas membuat library lagi?
    bukannya dari CI itu sudah tersedia library yang cukup lengkap ya?

  • @teguh : Library mana yang mas maksud? Auth.php? Sepertinya belum ada mas…

  • tolong dong mas buat tampilan view buat form_login. kalau saya buat sendiri form_loginnya ngk nampil mas
    404 Page Not Found

    The page you requested was not found.

    tapi kalau saya buat sendiri control untuk nampilin form_login tampil mas

  • thks aq coba dulu,, nanti kalo ada masalah tanya ya?

  • Mas, mau nanya ya..
    Library yg anda buat itu kan untuk pembatasan hak akses terhadap setiap controllernya kan?! tapi kalau saya pengen buat sampai ke fungsi di dalam controllernya bagaimana ya??
    bayangan saya, saya isikan dalam tabel menu itu semua fungsi controller yang telah kita buat kemudian saya panggil restrict dan cek di setiap fungsi pada baris pertama. Tapi kalau sprti itu saya rasa kurang efisien..

  • @Eko budi :
    Benar seperti itu mas. Lha sekarang dipikir” jg memang harus seperti itu…setiap pintu hrs kita jaga..,mau gmn lagi? Logikanya tetap ada kode diawal baris fungsi tsb.

  • session nya error kayak gini:

    A PHP Error was encountered
    Severity: Warning
    Message: Cannot modify header information – headers already sent by (output started at C:\AppServ\www\template-ci\system\application\config\config.php:1)
    Filename: libraries/Session.php
    Line Number: 662

    di autoload sudah diload library sessionnya.
    Help me

  • @jhono : ini menerapkan yg mana mas?

  • mas, mau tanya gimana caranya klo kita pengen buat sekitar 4 user, tapi user ini memiliki fungsi yang berbeda. misal user pertama input data customer, user kedua input hasil dari pilihan customer, user ke 3 dan kee 4 ini dia analisis datanya. kira-kira stuktur direktorinya gimana? dan nyambunginnya gimana, terimakasih

  • Artikelnya sangat membantu..
    saya masih newbie, ditunggu artikel berikutnya…


Leave a comment