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.
Konsepnya adalah sebagai berikut :
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, ) 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, ) 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, ) 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');
- 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.
- 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.
- 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.
Untuk menggunakannya kita terapkan dalam controller login sebagai berikut.
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 return FALSE; // value dalam array hanya boleh ada 2 // tidak lebih dan tidak kurang 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; } '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; { 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.
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'); } }
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.
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->simplival->cek(2); } }
Feel free to comment. Good luck and happy coding!!