Tutorial CodeIgniter : Authentication System Ehm ehm…kali 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.
Mempersiapkan Tabel di Database Ada tiga tabel yang akan kita buat, yaitu user, level, dan menu. Langsung saja, berikut sql querynya.
-- -------------------------------------------------------- Table structure for `user` -- ------------------------------------------------------CREATE TABLE `user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, `user_nama` varchar(100) NOT NULL, `user_username` varchar(100) NOT NULL, `user_password` varchar(100) NOT NULL, `user_level` int(5) NOT NULL, PRIMARY KEY (`user_id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- -------------------------------------------------------- Records of `user` -- ------------------------------------------------------BEGIN; INSERT INTO `user` VALUES ('1', 'Amanda Putri', 'amanda', '827ccb0eea8a706c4c34a16891f84e '827ccb0eea8a706c4c34a16891f84e7b', 7b', '1'), ('2', 'Betty Prameswari', 'betty', '827ccb0eea8a706c4c34a16891f84e7b', '827ccb0eea8a706c4c34a16891f84e7b', '2'), ('3', 'Cahya Wulandari', 'cahya', '827ccb0eea8a706c4c34a16891f84e7b', '827ccb0eea8a706c4c34a16891f84e7b', '3'); COMMIT; -- -------------------------------------------------------- Table structure for `level` -- ------------------------------------------------------CREATE TABLE `level` ( `level_id` int(5) NOT NULL AUTO_INCREMENT, `level_nama` varchar(100) NOT NULL, PRIMARY KEY (`level_id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- -------------------------------------------------------- Records of `level` -- ------------------------------------------------------BEGIN; INSERT INTO `level` VALUES ('1', 'Root'), ('2', 'Administrator'), ('3', 'Operator'); COMMIT; -- -------------------------------------------------------- Table structure for `menu` -- ------------------------------------------------------CREATE TABLE `menu` ( `menu_id` int(11) NOT NULL AUTO_INCREMENT, `menu_nama` varchar(100) NOT NULL, `menu_uri` varchar(100) NOT NULL, `menu_allowed` varchar(100) NOT NULL, PRIMARY KEY (`menu_id`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- -------------------------------------------------------- Records of `menu` -- ------------------------------------------------------BEGIN; INSERT INTO `menu` VALUES ('1', 'Manajemen Menu', 'home/manajemen_menu', '+1+'), ('2', 'Manejemen User', 'home/manajemen_user', 'home/manajemen_user', '+1+2+'), ('3', 'Input Transaksi', 'home/input_transaksi', 'home/input_transaksi', '+1+2+3+'); COMMIT;
Setelah query dijalankan, kita akan memiliki ketiga tabel tersebut. Berikut tam pilannya.
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 level menyimpan data level untuk membedakan wewenang user.
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
form_open('home/login');?>
Login Form
"; ing:3px;'>"; echo $login_info; echo ''; } ?>
Username |
?> |
Password | |
| mit','LOGIN');?> |
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.
auth->is_logged_in() if($this->auth->is_logged_in() == false) { $this->login(); } else { $this->template->set('title','W $this->template->set('title','Welcome elcome user! | MyWebApplication.com'); $this->template->load('template $this->template->load('template','admin/index') ','admin/index'); ; } } public function login() { $this->load->library('form_validation'); $this->form_validation->set_rul $this->form_validation->set_rules('username', es('username', 'Username', 'trim|required'); $this->form_validation->set_rul $this->form_validation->set_rules('password', es('password', 'Password', 'trim|required'); $this->form_validation->set_err $this->form_validation->set_error_delimiters(' or_delimiters('
', style="color:#FF0000">', ''); if ($this->form_validation->run ($this->form_validation->run() () == FALSE) { $this->template->set('title','L $this->template->set('title','Login ogin Form | MyWebApplication.com'); MyWebApplication.com'); $this->template->load('template $this->template->load('template','admin/login_f ','admin/login_form'); orm'); } else
{ $username = $this->input->po $this->input->post('username'); st('username'); $password = $this->input->po $this->input->post('password'); st('password'); $success = $this->auth->do_login($username $this->auth->do_login($username,$password); ,$password); if($success) { // lemparkan ke halaman index user redirect('home/index'); } else { $this->template->set('title','Log $this->template-> set('title','Login in Form | MyWebApplication.com'); $data['login_info'] $data['login_info '] = "Maaf, username dan password salah!"; $this->template->load('template', $this->template-> load('template','admin/login_for 'admin/login_form',$data); m',$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.
CI =& get_instance(); } // untuk validasi login function do_login($username,$password) do_login($username,$password) { // cek di database, ada ga? $this->CI->db->from('user'); $this->CI->db->where('user_user $this->CI->db->where('user_username',$username) name',$username); ; $this->CI->db->where('user_pass $this->CI->db->where('user_password=MD5("'.$pas word=MD5("'.$password.'")','',fa sword.'")','',false); lse); $result = $this->CI->db->g $this->CI->db->get(); et(); if($result->num_rows() 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_ $userdata->user_id, id, 'nama' => $userdata->user_ $userdata->user_nama, nama, 'level' => $userdata->user_ $userdata->user_level level ); // buat session
$this->CI->session->set_userdat $this->CI->session->set_userdata($session_data) a($session_data); ; return true; } } // untuk mengecek apakah user sudah login/belum function is_logged_in() { if($this->CI->session->userdata if($this->CI->session->userdata('user_id') ('user_id') == '') { return false; } return true; } // untuk validasi di setiap halaman yang mengharuskan authentikasi authentikasi function restrict() { if($this->is_logged_in() 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), sebelumnya), dengan kode berikut.
if ( ! defined('BASEPATH')) defined('BASEPATH')) exit('No direct script access
allowed');?>
Dashboard
class='title'>Dashboard
Autoload Library : session, database, auth (tutorial ini), template (tutorial sebelumnya)
Mengisi $config['encryption_key'] pada application/config/config.ph application/config/config.php p
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 ha laman ‘dashboard’ yang masih kosong, hanya ada tampilan ucapan selamat datang.
Menampilkan Menu Spesifik untuk User Ciee…yang sudah berhasil buat login system? Hehe
…jangan senang dulu, mari kita lanjutkan. Sampai disini,
user hanya disuguhkan halaman dashboard yang kosong. Wah, kasian amat ya? Mari kita tampilkan menumenu untuk para user, sesuai dengan levelnya masing-masing. Let’s start. Kita akan memakai model untuk melakukan query ke database (tabel menu).
db->from('menu'); $this->db->like('menu_allowed', $this->db->like('menu_allowed','+'.$user_level. '+'.$user_level.'+'); '+'); $result = $this->db->get() $this->db->get(); ; return $result; } } Simpan kode di atas dengan nama ‘ usermodel.php‘ dan tempatkan di folder ‘application/models/‘.
Selanjutnya, modifikasi f ungsi ungsi ‘index‘ yang ada di controller ‘ home‘ seperti berikut ini.
public function index() { if($this->auth->is_logged_in() if($this->auth->is_logged_in() == false) { $this->login(); } else { // load model 'usermodel' $this->load->model('usermodel'); // level untuk user ini $level = $this->session->u $this->session->userdata('level') serdata('level'); ; // ambil menu dari database sesuai dengan level $data['menu'] = $this->usermodel->get_menu_for_ $this->usermodel->get_menu_for_level($level); level($level); $this->template->set('title','W $this->template->set('title','Welcome elcome user! | MyWebApplication.com'); MyWebApplication.com'); // tampilkan halaman dashboard dengan data menu $this->template->load('template $this->template->load('template','admin/index', ','admin/index',$data); $data); }