Tutorial CodeIgniter
Tutorial CodeIgniter
Ehm ehmkali ini, saya akan menjelaskan tentang authentication system. Sebenarnya saya bingung mau diberi judul apa , yasudahlah ini saja. Intinya nanti saya akan membahas tentang bagaimana membuat prosedur
login user, manajemen role/level dan manajemen menu. Saya pikir ketiga hal tersebut adalah satu paket di dalam sebuah authentication system (ya ga sih? ).
Catatan
: Agar
lebih
memudahkan
Anda,
silakan
download
sampel
kode
: auth_system.zip
Namun demikian, agar mengetahui detail penggunaan kode, disarankan Anda tetap mengikuti tutorial ini.
Di dalam sebuah sistem informasi, bahkan selevel CMS pun, role management adalah hal yang mutlak harus ada. Contohnya saja wordpress, yang memiliki 6 role, dari level teratas Super Admin sampai level terendah, Subscriber. Tentu saja, setiap role (level) ini memiliki wewenang tersendiri. Wewenang ini dapat pula beririsan, misalnya saja, level Editor boleh melakukan wewenang milik level Author.
Pada gambar di atas, jelas tergambar konsep role management dalam sebuah aplikasi. Kita akan mencoba membuat hal semacam itu, dengan konsep menu dan level. Intinya, menu yang kita buat, akan memiliki daftar level yang boleh mengaksesnya.
Setelah query dijalankan, kita akan memiliki ketiga tabel tersebut. Berikut tampilannya.
Tabel user berfungsi menyimpan data user yang boleh log in di sistem kita (dengan informasi login di kolom username dan password). Password dienkripsi dengan fungsi MD5.
Tabel Menu menyimpan semua data menu yang ada di sistem yang diasosiasikan dengan level, yaitu di kolommenu_allowed. Kolom tersebut menjelaskan bahwa menu tersebut hanya boleh diakses oleh LEVEL dengan level_id yang dipisahkan dengan tanda +.
Login ke Sistem
Selanjutnya kita akan membuat prosedur user yang akan login ke sistem. Kita sudah memiliki tabel user, yang tentu cukup sebagai informasi login system. Pertama-tama, buat view yang berisi form login. Catatan: Sebelum melanjutkan, 1. Bagi Anda yang belum pernah menggunakan library form validation CI, saya menyarankan Anda untuk membaca user guide : Form Validation, 2. Karena tutorial ini memerlukan layout (tampilan) sistem, maka Anda perlu mengikuti tutorial sebelumnya, Tutorial CodeIgniter : Membuat Template <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');?> <?php echo form_open('home/login');?> <div class='title'>Login Form</div> <?php // hanya untuk menampilkan informasi saja if(isset($login_info)) { echo "<span style='background-color:#eee;padding:3px;'>"; echo $login_info; echo '</span>'; } ?> <table> <tr> <td>Username</td> <td> <?php echo form_input('username',set_value('username')); echo form_error('username');
?> </td> </tr> <tr> <td>Password</td> <td> <?php echo form_password('password'); echo form_error('password'); ?> </td> </tr> <tr> <td></td> <td><?php echo form_submit('submit','LOGIN');?></td> </tr> </table> <?php echo form_close(); Sudah? Good, lets go ahead. Simpan kode di atas ke dalam folder application/views/admin/ dengan nama login_form.php. Seperti yang dapat Anda lihat di baris ke-3 kode di atas, form login tersebut diarahkan ke controller home, fungsi login. Silakan buka file controller home.php yang telah kita buat di tutorial sebelumnya, Tutorial CodeIgniter : Membuat Template. Modifikasi file tersebut dengan kode sbb. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Home extends CI_Controller { public function __construct() { parent::__construct(); } public function index() { if($this->auth->is_logged_in() == false) { $this->login(); } else { $this->template->set('title','Welcome user! | MyWebApplication.com'); $this->template->load('template','admin/index'); } } public function login() { $this->load->library('form_validation'); $this->form_validation->set_rules('username', 'Username', 'trim|required'); $this->form_validation->set_rules('password', 'Password', 'trim|required'); $this->form_validation->set_error_delimiters(' <span style="color:#FF0000">', '</span>'); if ($this->form_validation->run() == FALSE) { $this->template->set('title','Login Form | MyWebApplication.com'); $this->template->load('template','admin/login_form'); } else
{ $username = $this->input->post('username'); $password = $this->input->post('password'); $success = $this->auth->do_login($username,$password); if($success) { // lemparkan ke halaman index user redirect('home/index'); } else { $this->template->set('title','Login Form | MyWebApplication.com'); $data['login_info'] = "Maaf, username dan password salah!"; $this->template->load('template','admin/login_form',$data); } } } } Jika Anda sudah membaca dan memahami user guide untuk form validation library, tentu kode di atas akan langsung dapat Anda tangkap dengan cepat. Intinya adalah, user login diarahkan ke fungsi login, lalu username dan password yang dimasukkan tersebut akan melewati dua kali validasi. Validasi pertama dilakukan oleh form validation class, yang akan mengevaluasi rules yang sudah kita berikan (dalam hal ini adalah required, artinya harus diisi). Lapis kedua adalah validasi database. Untuk validasi database dilakukan oleh library auth. Loh? Mana library-nya? Sabar, ini dia kodenya. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * Auth library * * @author Anggy Trisnawan */ class Auth{ var $CI = NULL; function __construct() { // get CI's object $this->CI =& get_instance(); } // untuk validasi login function do_login($username,$password) { // cek di database, ada ga? $this->CI->db->from('user'); $this->CI->db->where('user_username',$username); $this->CI->db->where('user_password=MD5("'.$password.'")','',false); $result = $this->CI->db->get(); if($result->num_rows() == 0) { // username dan password tsb tidak ada return false; } else { // ada, maka ambil informasi dari database $userdata = $result->row(); $session_data = array( 'user_id' => $userdata->user_id, 'nama' => $userdata->user_nama, 'level' => $userdata->user_level ); // buat session
$this->CI->session->set_userdata($session_data); return true; } } // untuk mengecek apakah user sudah login/belum function is_logged_in() { if($this->CI->session->userdata('user_id') == '') { return false; } return true; } // untuk validasi di setiap halaman yang mengharuskan authentikasi function restrict() { if($this->is_logged_in() == false) { redirect('home/login'); } } } Nah, simpan kode di atas dengan nama auth.php dan tempatkan di folder application/libraries/. Saya rasa penjelasannya cukup lewat code comments. Jika Anda merasa ada yang kurang jelas, silakan tulis di komentar .
Terakhir, update file view index.php (yang juga sudah kita buat pada tutorial sebelumnya), dengan kode berikut. <?php if ( ! defined('BASEPATH')) exit('No direct script access
Perhatian: Agar tutorial kali ini dapat berjalan tanpa error, pastikan:
Autoload Library : session, database, auth (tutorial ini), template (tutorial sebelumnya) Autoload Helper : url, form Mengisi $config['encryption_key'] pada application/config/config.php
Oke, sampai di sini kita sudah memiliki paket user login. Silakan cek di browser, http://localhost/folder_aplikasi/index.php/home Cobalah login dengan salah satu username dan password yang sudah kita buat, oh ya, passwordnya adalah: 12345 (di database terenkripsi MD5). Jika berhasil, maka Anda akan dilarikan ke halaman dashboard yang masih kosong, hanya ada tampilan ucapan selamat datang.
Catatan: Untuk mengakomodasi kelanjutan tutorial ini, silakan login dengan: username : amanda password : 12345
} Nah, terakhir, modifikasi view admin/index.php sbb. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');?> <div class='title'>Dashboard</div> Welcome, <?php echo $this->session->userdata('nama');?> <br /><br /> Menu yang tersedia untuk Anda : <ul> <?php foreach($menu->result() as $row) { echo '<li>'.anchor($row->menu_uri,$row->menu_nama).'</li>'; } ?> </ul> Thats it. Silakan test dengan merefresh halaman (jika anda sudah login, jika belum maka loginlah terlebih dahulu sebelum Anda diloginkan :halah). Sampai disini, menu untuk user tersebut telah ditampilkan, tetapi, halaman yang dituju untuk setiap menu itu belum ada. Sebagai contoh, lihatlah kolom menu_uri di tabel menu, itulah controller/fungsi yang perlu Anda sediakan. Di tulisan ini akan saya contohkan untuk satu menu saja, yaitu manajemen menu. Namun, tampilannya nanti hanya tampilan dummy saja. Anda perlu membuat tampilan sendiri sesuai dengan menu tsb. Biasanya, untuk manajemen menu, mungkin bisa ditampilkan data menu, kemudian ada form input menu dsb. Yang terpenting disini adalah Anda memahami konsep pembuatan sebuah halaman menu.
Untuk membuat halaman menu, Anda perlu membuat fungsi di dalam controller, sesuai dengan kolom menu_uri yang Anda masukkan dalam tabel menu. Misalnya saja untuk menu Manajemen menu, yang memiliki menu_uri : home/manajemen_menu, maka Anda perlu membuat fungsi manajemen_menu pada controller home. Kode untuk fungsi ini saya contohkan sbb. public function manajemen_menu() { // mencegah user yang belum login untuk mengakses halaman ini $this->auth->restrict(); // mencegah user mengakses menu yang tidak boleh ia buka $this->auth->cek_menu(1); // tampilkan isi menu manajemen menu (mungkin tabel menu/input form menu) $this->template->set('title','Manajemen User | MyWebApplication.com'); $this->template->load('template','admin/manajemen_menu'); } Tambahkan fungsi tersebut pada controller home. Nah, untuk fungsi di atas, terdapat fungsi cek_menu milik library auth. Ya, memang kita belum memilikinya, oleh karenanya, edit library auth.php dengan menambahkan fungsi berikut. // untuk mengecek menu function cek_menu($idmenu)
{ $this->CI->load->model('usermodel'); $status_user = $this->CI->session->userdata('level'); $allowed_level = $this->CI->usermodel->get_array_menu($idmenu); if(in_array($status_user,$allowed_level) == false) { die("Maaf, Anda tidak berhak untuk mengakses halaman ini."); } } Fungsi cek_menu() tersebut membutuhkan parameter $idmenu, yang dapat Anda lihat di tabel menu, kolom menu_id. Eittlagi-lagi ada fungsi yang belum dibuat, yaitu get_array_menu milik usermodel. Okelah ayo kita buat dulu, buka file model usermodel.php dan tambahkan fungsi berikut. function get_array_menu($id) { $this->db->select('menu_allowed'); $this->db->from('menu'); $this->db->where('menu_id',$id); $data = $this->db->get(); if($data->num_rows() > 0) { $row = $data->row(); $level = $row->menu_allowed; $arr = explode('+',$level); return $arr; } else { die(); } } Terakhir, buat file viewnya. <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');?> <div class='title'>Manajemen Menu</div> Ini adalah halaman untuk memanajemen menu. Sekian terima kasih.
Yaywere done! Coba klik menu Manajemen Menu (menu ini akan muncul hanya jika Anda login menggunakan user amanda).