Thinking as far as claims and issuers is an effective reflection that backs better approaches for securing your application. Claims have an understanding with the issuer and allow the claims of the user to be accepted only if the claims are issued by
CodeIgniter Lab http://leonguyen.com
Panduan Codeigniter
ABSTRACT The usability of security systems has become a major issue in research on the efficiency and user acceptance of security systems. The authentication process is essential for contr…Full description
Tests phpunit with codeignierDescripción completa
phpFull description
Framework is important for large scale object oriented software systems for development. They offer market value for high productivity and low time through design and recycling codes. CodeIgniter is a PHP framework developed by Alice Lab and does not
codeigniterDeskripsi lengkap
Full description
This Document helps to you better understand on how to use external Table for Authentication.
Descripción completa
Descripción: paso a paso de codeigniter
Membuat siaka dengan codeigniter 3Full description
wewFull description
In current ATM process there is lot of ATM fraud Malicious money transaction and theft are happens by means of lack of privacy protection in current scheme. We address the problem of shoulder surfing attacks on authentication schemes by proposing Ill
ciscoDescripción completa
In face authentication system we authenticate a user using ones face and OTP received through mobile communication services this is a two layered authentication system where first the face of the user is verified using traditional face structure auth
Cloud computing is one of today's most exciting technologies due to its ability to reduce cost associated with computing. This technology worldwide used to improve the business infrastructure and performance. The major threat that the cloud is facing
Cloud computing is one of today's most exciting technologies due to its ability to reduce cost associated with computing. This technology worldwide used to improve the business infrastructure and performance. The major threat that the cloud is facing
CLSC Development Team
Codeigniter User Authentication Menggunakan Library Ion Auth
Toni Haryanto 9/10/2011
Codeigniter User Authentication menggunakan Library Ion Auth
Page 2 of 18
Pada modul kali ini kita akan mempelajari library Ion Auth dan bagaimana memanfaatkannya untuk membuat sistem user authentication atau autentikasi pengguna. Poin-poin yang akan kita pelajari diantaranya: memuat user
Poin ini akan membahas langkah-langkah membuat sistem registrasi
registration
pengguna, mulai dari membuat form registrasi, mengamankannya, menyimpan data ke dalam database, mengirimkan email konfirmasi, dan melakukan aktivasi akun
membuat
Poin ini akan membahas langkah-langkah membuat sistem login mulai
sistem login
dari membuat form login, melakukan pengecekan akun, dan routing halaman setelah proses login
membuat
Poin ini akan membahas langkah-langkah membuat sistem untuk
sistem forgot
menanggulangi lupa password penguna, mulai dari membuat form
password
lupa password, mengecek kecocokan akun, mengirimkan email konfirmasi reset password, mereset password, dan mengirimkan email berisi password baru yang telah digenerate
Untuk membuat proyek autentikasi ini kita akan menggunakan beberapa library bawaan codeigniter dan library tambahan serta beberapa helper, diantaranya: Ion auth class
Salahsatu library yang dikembangkan oleh komunitas untuk mengakomodir keperluan autentikasi mulai dari registrasi hingga reset password
Session class
Library dengan fitur yang komplit untuk mendukung managemen session
Form validation
Library untuk mengatur validasi data pada form dalam proses input
class
data
Input class
Library untuk memastikan keamanan data yang diinputkan sebelum disetorkan ke database. Library ini sudah otomatis diload.
Form Helper
Helper berisi kumpulan fungsi untuk membantu pembuatan form
URL helper
Helper berisi kumpulan fungsi untuk membantu pekerjaan dengan URL
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 3 of 18
Tidak usah bingung dengan banyaknya library dan helper yang akan kita gunakan karena justru library dan helper inilah yang akan membantu kita mempercepat pekerjaan kita.
Pendahuluan Berbicara tentang autentikasi maka erat kaitannya dengan session. Session digunakan untuk mengatur dan memantau kegiatan seorang pengguna dan mencatatnya selama pengguna tersebut berselancar di sebuah situs. Alur autentikasi secara sederhana pada umumnya yakni, suatu situs akan menyimpan data keaktifan seorang pengguna pada session setelah ia login di situs tersebut. Data session tersebut akan selalu digunakan untuk mengecek apakah pengguna tersebut masih aktif, yang memungkinkan ia mengakses suatu halaman yang hanya boleh diakses oleh pengguna terdaftar. Apabila pengguna itu keluar atau logout dari situs tersebut, maka data session akan dihapus dan pengguna tersebut tidak akan dapat mengakses halaman tertentu hingga ia login lagi. Codeigniter sudah menyediakan Class Session sebagai library yang bisa kita manfaatkan untuk mengatur semua penggunaan session. Akan tetapi pada modul ini kita tidak akan menggunakan library session untuk membuat sistem autentikasi, karena kita akan memanfaatkan sebuah library bernama Ion Auth yang sudah mencakup kebutuhan autentikasi dan managemen session untuk autentikasi.
Skema Database Berikut skema database untuk program autentikasi dari ion auth.
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 4 of 18
Hal penting yang mesti diketahui mengenai database: -
field utama di table users yang mesti kita perhatikan cukup username, email dan password. Apabila kita memerlukan field lain untuk menyimpan data profil user, buatlah field baru di table meta.
-
Secara default table group berisi dua baris record, yakni group admin dan members. Akun admin default juga sudah dibuat, yakni dengan email: [email protected] dan password: password.
-
Kita sebenarnya dapat mengganti nama ketiga tabel tersebut sesuai keinginan kita. Kita hanya perlu mendaftarkannya di file config/ion_auth.php: $config['tables']['groups'] $config['tables']['users'] $config['tables']['meta']
= 'groups'; = 'users'; = 'meta';
dengan mengganti nilai dari ketiga index variabel array diatas sesuai nama tabelnya masing-masing.
#0 Pengaturan Awal
-
Download Codeigniter versi terbaru.
-
Merge folder config/, controllers/, language/, libraries/, models/, dan views/ dari Ion Auth yang telah dimodifikasi ke dalam folder application/ di codeigniter untuk mendapatkan hasil akhir. Untuk mengikuti modul ini cukup pindahkan file config/ion_auth.php, folder language/, file libraries/Ion_auth.php dan models/ion_auth_models.php ke dalam folder application/ karena file-file tersebutlah inti dari library Ion Auth.
-
Buat sebuah database di mysql, dan import file ion_auth.sql ke dalam database tersebut.
-
Sisanya atur setting di file
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 5 of 18
config/database.php sesuai dengan pengaturan database Anda.
-
Atur konfigurasi ion auth sesuai kebutuhan. Baris konfigurasi yang akan kita modifikasi adalah $config['email_activation']. Default nilainya adalah false yang artinya kita tidak akan mengirimkan email aktivasi untuk setiap user yang mendaftar. Sesuai skenario yang telah dipaparkan di awal, maka silakan ganti nilai konfigurasi tersebut menjadi true.
#1 User Registration Alur data untuk sistem registrasi yang akan kita buat sebagai berikut: -
user mengisikan data diri melalui form registrasi
-
program mengecek apakah data sudah sesuai dengan permintaan data yang harus dimasukkan
-
apabila data tidak sesuai permintaan, maka kembalikan user ke halaman form dan dipersilakan memperbaiki data hingga data yang dimasukkan sesuai dengan permintaan
-
apabila data sudah sesuai ketentuan, maka data akan disimpan di dalam database dengan status akun non-aktif, kemudian program mengirimkan email konfirmasi ke alamat email yang sudah dimasukkan, berupa link untuk aktivasi akun. User akan mendapat pemberitahuan bahwa registrasi selesai dan diminta untuk mengecek email yang sudah dikirimkan
-
apabila user membuka link aktivasi tersebut, tandanya email yang dimasukkan valid dan program akan mengaktifkan akun dari user tersebut
Langkah pertama adalah membuat file controller bernama auth.php di dalam folder controllers/. Kemudian isi dengan baris kode berikut. load->library('ion_auth');
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 6 of 18
$this->load->library('session'); $this->load->library('form_validation'); $this->load->helper(array('url', 'form')); } function registrasi() { //apabila user sudah login, maka halaman register tidak dapat ditampilkan if ($this->ion_auth->logged_in()) { redirect('auth/index'); } $data['title'] = "Halaman Registrasi"; //validasi form register //username wajib diisi, bersih dari cross site scripting dan minimal 4 karakter $this->form_validation->set_rules('username', 'Username', 'required|xss_clean|min_length[4]'); //alamat email wajib diisi dan sesuai dengan format email $this->form_validation->set_rules('email', 'Alamat Email', 'required|valid_email'); //nama depan wajib diisi dan bersih dari cross site scripting $this->form_validation->set_rules('first_name', 'Nama Depan', 'required|xss_clean'); //nama belakang wajib diisi dan bersih dari cross site scripting $this->form_validation->set_rules('last_name', 'Nama Belakang', 'required|xss_clean'); //nomor telepon wajib diisi dengan angka, bersih dari cross site scripting, rentang 7-12 karakter $this->form_validation->set_rules('phone', 'Nomor Telepon', 'required|numeric|xss_clean|min_length[7]|max_length[12]'); //nama perusahaan wajib diisi dan bersih dari cross site scripting $this->form_validation->set_rules('company', 'Perusahaan', 'required|xss_clean'); //password wajib diisi, jumlah karakter lebih dari angka pengaturan min_password_length dan cocok dengan field password_confirm $this->form_validation->set_rules('password', 'Password', 'required| min_length[' . $this->config->item('min_password_length', 'ion_auth') . ']| max_length[' . $this->config->item('max_password_length', 'ion_auth') . ']| matches[password_confirm]'); $this->form_validation->set_rules('password_confirm', 'Konfirmasi Password', 'required'); //apabila validasi benar if ($this->form_validation->run() == true) { //Field utama untuk autentikasi adalah username, email dan password,
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 7 of 18
disimpan di table users //selain ketiga itu dikelompokkan ke additional data dan disimpan di table meta //post nilai untuk username, email dan password $username = $this->input->post('username', true); $email = $this->input->post('email'); $password = $this->input->post('password'); //ini data tambahan untuk profil user $additional_data = array( 'first_name' => $this->input->post('first_name'), 'last_name' => $this->input->post('last_name'), 'company' => $this->input->post('company'), 'phone' => $this->input->post('phone') ); } //apabila proses registrasi berhasil if ($this->form_validation->run() == true && $this->ion_auth->register($username, $password, $email, $additional_data)) { //redirect ke halaman depan dengan notifikasi untuk aktivasi $this->session->set_flashdata('message', "Akun telah dibuat. Silakan cek email untuk aktivasi."); redirect('auth/login'); //apabila akun langsung aktif tanpa perlu aktivasi via notifikasi email: //$this->session->set_flashdata('message', "Akun telah dibuat. Silakan login."); //redirect('auth/login'); } else //apabila validasi salah atau membuka halaman pertama kali { //set flashdata untuk kesalahan input atau untuk pesan error sebelumnya $main['message'] = (validation_errors()) ? validation_errors() : $this->ion_auth->errors(); //buat array untuk membuat field form $main['username'] = array('name' => 'username', 'id' => 'username', 'type' => 'text', 'value' => $this->form_validation->set_value('username'), ); $main['email'] = array('name' => 'email', 'id' => 'email', 'type' => 'text', 'value' => $this->form_validation->set_value('email'), ); $main['first_name'] = array('name' => 'first_name', 'id' => 'first_name', 'type' => 'text', 'value' => $this->form_validation->set_value('first_name'), ); $main['last_name'] = array('name' => 'last_name',
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Buat file view template.php di dalam folder views/ lalu isikan baris kode berikut.
Buat file view register_v.php di dalam folder views/ lalu isikan baris kode berikut.
Silakan isikan data Anda di form ini.
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 9 of 18
Username:
Alamat Email:
Nama Depan:
Nama Belakang:
Nama Perusahaan:
Nomor Telepon:
Password:
Ulangi Password:
Begitu user registrasi, maka user akan dikirimi email untuk aktivasi akun. Ion auth sudah otomatis mengirimkan email aktivasi apabila kita mengkonfigurasi untuk pengiriman email aktivasi. Sehingga kita perlu mempersiapkan template untuk email aktivasi yang nantinya digunakan oleh ion auth untuk format teks email. Nama file template untuk aktivasi email mesti diatur di file konfigurasi ion_auth.php, yang mana sudah memiliki nilai default: $config['email_templates'] $config['email_activate']
= 'email/'; = 'activate.tpl.php';
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 10 of 18
konfigurasi ini maksudnya, kita menggunakan file template email bernama activate.tpl.php untuk email aktivasi, yang disimpan di folder views/email/. Maka sekarang kita akan membuat file tersebut, dan ini kodenya.
Aktivasi akun untuk
Silakan klik link berikut untuk .
Begitu email tersebut sampai pada user, ia harus mengklik link aktivasi tersebut untuk mengaktifkan akunnya. Kita perlu membuat satu fungsi lagi untuk menangkap permintaan aktivasi tersebut. Tambahkan satu fungsi aktivasi() di dalam controller auth.php. function aktivasi($id, $code=false) { //apabila $code berisi nilai dari link yang dikirim melalui email if ($code !== false) //aktifkan akun dengan id $id dengan terlebih dahulu mencocokkan $code //dengan yang sudah terdaftar di dalam database $activation = $this->ion_auth->activate($id, $code); //apabila aktivasi berhasil if ($activation) { //redirect ke auth/index untuk dipersilakan login $this->session->set_flashdata('message', $this->ion_auth->messages()); redirect('auth/login'); } else //apabila aktivasi gagal { //redirect ke halaman lupa_password() $this->session->set_flashdata('message', $this->ion_auth->errors()); redirect('auth/lupa_password'); } }
di dalam fungsi aktivasi() di atas ada kode untuk redirect() ke halaman login apabila aktivasi berhasil, oleh karena itu mari kita lanjutkan ke tahap dua membuat login system.
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 11 of 18
#2 Login System Alur data untuk sistem login yang akan kita buat sebagai berikut: -
user memasukkan kombinasi email dan password melalui form login
-
program mengecek apakah kombinasi email dan password yang dimasukkan ditemukan di dalam database
-
apabila kombinasi email dan password ditemukan maka user akan dilanjutkan ke halaman terautentikasi sesuai role / status akunnya. Apabila status akunnya sebagai users maka user tersebut akan dilanjutkan ke halaman users. Apabila status akunnya sebagai administrator maka user tersebut akan dilanjutkan ke halaman administrator.
-
Apabila kombinasi email dan password tidak ditemukan maka user akan dikembalikan ke halaman form login dengan pemberitahuan gagal login.
Langkah pertama silakan tambahkan satu fungsi bernama login() di dalam controller auth.php seperti berikut. public function login() { //bila sudah login if ($this->ion_auth->logged_in()) { //tidak perlu lagi mengakses halaman form login redirect('auth/index'); } $data['title'] = "Halaman Login"; //buat validasi input form login //validasi username wajib diisi dan bersih dari cross site scripting $this->form_validation->set_rules('email', 'Email', 'required|valid_email'); //validasi password wajib diisi $this->form_validation->set_rules('password', 'Password', 'required'); //apabila validasi benar if ($this->form_validation->run() == true) { //cek apakah "remember me" dicentang $remember = (bool) $this->input->post('remember');
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 12 of 18
//cek pada database, bila kombinasi username dan password benar if ($this->ion_auth->login($this->input->post('email'), $this->input->post('password'), $remember)) { //set pesan berhasil login pada session flashdata $this->session->set_flashdata('message', $this->ion_auth->messages()); //redirect ke halaman beranda untuk dirouting sesuai rolenya redirect('auth/index'); } else //apabila login gagal { //set pesan error login pada session flashdata $this->session->set_flashdata('message', $this->ion_auth->errors()); //redirect kembali ke halaman login redirect('auth/login', 'refresh'); } } else //apabila validasi form login salah atau belum diisi { //set flashdata untuk kesalahan input atau untuk pesan error sebelumnya $main['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message'); $main['email'] = array('name' => 'email', 'id' => 'email', 'type' => 'text', 'value' => $this->form_validation->set_value('email'), ); $main['password'] = array('name' => 'password', 'id' => 'password', 'type' => 'password', ); $data['content'] = $this->load->view('login_v', $main, true); $this->load->view('template', $data); }
}
Buat file login_v.php untuk menampilkan viewnya.
Silakan login dengan email dan password Anda.
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Untuk dapat melihat apakah user berhasil login, maka kita harus mempersiapkan halaman yang hanya dapat diakses apabila telah login. Maka dari itu, mari kita buat dua buah fungsi, user_page() dan admin_page(). Fungsi user_page() akan ditampilkan apabila user non-admin berhasil login. Apabila user adalah admin, maka redirect ke halaman admin_page(). Routing user yang sudah login ini dilakukan di fungsi index() sehingga kita mesti membuat fungsi index() tersebut. Sekarang mari kita buat fungsi index() terlebih dahulu. public function index(){ //apabila user sudah login, if ($this->ion_auth->logged_in()){ //apabila user adalah admin if ($this->ion_auth->is_admin()){ //redirect ke halaman login redirect('auth/admin_page'); } else { //apabila user biasa //redirect ke halaman login redirect('auth/user_page'); } } else { //apabila belum login $data['title'] = "Halaman Beranda"; //memuat view beranda.php ke index array $data['content'] $data['content'] = $this->load->view('beranda_v', null, true); //menampilkan view template.php $this->load->view('template', $data); } }
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 14 of 18
Buat view beranda_v.php untuk menampilkan indexnya.
session->flashdata('message');?>
Anda belum login. untuk login silakan klik ">login. untuk membuat akun baru, silakan klik ">registrasi.
Setelah itu buat fungsi user_page() dan admin_page() untuk menampilkan halaman user.
function user_page(){ //apabila user sudah login if($this->ion_auth->logged_in()) { $data['title'] = "Halaman User/Member"; $data['content'] = $this->load->view('user_page_v', null, true); $this->load->view('template', $data); } else //apabila belum login { //redirect ke halaman login redirect('auth/login'); } } function admin_page(){ //apabila user sudah login dan statusnya sebagai administrator if($this->ion_auth->is_admin()) { $data['title'] = "Halaman Administrator"; $data['content'] = $this->load->view('admin_page_v', null, true); $this->load->view('template', $data); } else //apabila bukan administrator { //anggap halaman admin tersebut tidak ada show_404(); } }
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 15 of 18
Kemudian buat file view user_page_v.php dengan konten yang sederhana saja.
Ini adalah halaman User/Member dengan email session->userdata('username'); ?>. Untuk keluar silakan klik link ">logout.
buat file view admin_page_v.php juga.
Ini adalah halaman Administrator. Untuk keluar silakan klik link ">logout ini.
Berbicara login berarti mesti ada logout juga. Karenanya, tambahkan fungsi logout() di dalam controller Auth. function logout(){ //log out pengguna $this->ion_auth->logout(); //redirect ke halaman index redirect('auth'); }
#3 Forgot Password System Alur data untuk sistem lupa password yang akan kita buat sebagai berikut: -
user memasukkan alamat emailnya melalui form lupa password
-
program akan mencari alamat email tersebut di dalam database
-
apabila email ditemukan, maka program akan mengirimkan email notifikasi berupa link untuk mereset password. Apabila email tidak ditemukan, maka user akan diberitahu bahwa email yang dimasukkan tidak ditemukan.
-
apabila user yang mendapat email konfirmasi tersebut membuka link reset password, maka program akan mereset password dari akun email tersebut, kemudian mengirimkan lagi email notifikasi berisi password baru yang sudah digenerate.
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 16 of 18
Pertama-tama buat tampilan form untuk lupa password. Tambahkan fungsi lupa_password() di dalam controller Auth. function lupa_password() { $data['title'] = "Halaman Lupa Password"; //set validasi untuk email $this->form_validation->set_rules('email', 'Alamat Email', 'required|valid_email'); //apabila validasi salah atau form dibuka pertama kali if ($this->form_validation->run() == false) { $main['email'] = array('name' => 'email', 'id' => 'email', 'type' => 'text' ); $main['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message'); $data['content'] = $this->load->view('lupa_password_v', $main, true); $this->load->view('template', $data); } else //apabila validasi benar { //jalankan fungsi forgotten_password() untuk mengirimkan email link reset password $forgotten = $this->ion_auth ->forgotten_password($this->input-post('email')); //apabila tidak ada error if ($forgotten) { //set message dari library ke flashdata $this->session->set_flashdata('message', $this->ion_auth->messages()); redirect('auth/login', 'refresh'); } else //apabila ada error pada saat menjalankan forgotten_password() { //set pesan error dari library ke flashdata $this->session->set_flashdata('message', $this->ion_auth->errors()); redirect('auth/lupa_password', 'refresh'); } } }
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 17 of 18
Sekarang buat file view lupa_password_v.php untuk menampilkan form lupa password.
Silakan masukkan alamat email Anda dan kami akan mengirimkan link untuk mereset password Anda.
Alamat Email:
Karena fungsi lupa_password() ini akan mengiriman email berisi link untuk permintaan mereset password dan email untuk mengirimkan email berisi password baru yang sudah direset, maka seperti halnya email aktivasi, kita juga perlu membuat template email untuk kedua keperluan tersebut. Konfigurasinya juga ada di file config/ion_auth.php. $config['email_forgot_password'] = 'forgot_password.tpl.php'; $config['email_forgot_password_complete'] = 'new_password.tpl.php';
Maka sekarang kita akan membuat file forgot_password.tpl.php di dalam folder views/email/.
Reset Password untuk
Silakan klik link berikut untuk .
Buat juga file new_password.tpl.php di dalam folder views/email/.
Password baru untuk
Password Anda sudah direset menjadi:
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto
Codeigniter User Authentication menggunakan Library Ion Auth
Page 18 of 18
Terakhir, buat fungsi reset_password() untuk menangkap permintaan reset password dari link email user. function reset_password($code) { //mengirimkan kode $code, mencocokkannya dengan database dan mereset password $reset = $this->ion_auth->forgotten_password_complete($code); //apabila reset password sukses if ($reset) { //redirect ke halaman index $this->session->set_flashdata('message', $this->ion_auth->messages()); redirect('auth/index'); } else //apabila reset password gagal { //redirect ke halaman lupa_password() $this->session->set_flashdata('message', $this->ion_auth->errors()); redirect('auth/lupa_password'); } }
# Penutup Demikian modul Pelatihan pembuatan User Authentication pada Codeignter dengan Library Ion Auth. Anda dapat mengeksplorasi lebih jauh library ion auth dengan membuka user guide yang tersedia. Terima kasih dan selamat berlatih. ;D
Modul Pelatihan Codeigniter – CLSC Development Team – Toni Haryanto