Membuat Website dengan CodeIgniter #4
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 :
- 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.
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:
- Membuat Website dengan CodeIgniter #1
- Membuat Website dengan CodeIgniter #2
- Membuat Website dengan CodeIgniter #3
- Membuat Combobox Dinamis dengan CI dan Ajax
- Redirect dengan Delay Time di CodeIgniter
90 Comments
Leave a comment
Recent Posts
Recent Comments
- LUKISAN MODERN on Sharing Script CI 1.7.2 untuk Sistem Informasi
- Wawan on Share MyFinance : Aplikasi Keuangan Berbasis PHP MySQL
- chandra on Share MyFinance : Aplikasi Keuangan Berbasis PHP MySQL
- nophil on Sistem Presensi dan Billing Sekolah
- yazid on Membuat Combobox Dinamis dengan CI dan Ajax
- faqih on Sharing Script CI 1.7.2 untuk Sistem Informasi
- rangga on Share MyFinance : Aplikasi Keuangan Berbasis PHP MySQL
- reeyz on Membuat Website dengan CodeIgniter #1
- Rubby on Membuat Website dengan CodeIgniter #4
- Anggie on Membuat Website dengan CodeIgniter #1
- reeyz on Membuat Website dengan CodeIgniter #1
- Fajar on Share MyFinance : Aplikasi Keuangan Berbasis PHP MySQL
- newbie2 on Ajax File Upload (CodeIgniter dan JQuery)
- newbie on Ajax File Upload (CodeIgniter dan JQuery)
- ardy on Share MyFinance : Aplikasi Keuangan Berbasis PHP MySQL
- Tips Trik Blogging on Simple Tutorial CodeIgniter Episode 3
- Anggie on Share MyFinance : Aplikasi Keuangan Berbasis PHP MySQL
- Manz on Share MyFinance : Aplikasi Keuangan Berbasis PHP MySQL
- Manz on Membuat Combobox Dinamis dengan CI dan Ajax
- anggie on Share MyFinance : Aplikasi Keuangan Berbasis PHP MySQL



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 “&” 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…