Tutorial php Sistem Login dengan Tipe User & Hak Akses Berbeda menjelaskan langkah langkah membuat login sistem dengan beberapa tipe user yang memiliki hak akses yang berbeda beda pula.
Pada tutorial ini Anda mungkin menemukan hal baru atau hal yang bisa membingungkan, oleh karena itu Anda perlu membaca dengan seksama!
Sistem login menyangkut 2 hal/konsep/proses yaitu Otentikasi & Otorisasi atau Authentication & Authorization
Video Tutorial Membatasi Hak Akses Berdasarkan Tipe User
Kedua konsep ini perlu dipahami sebelum memulai membuat kode login sistem yang akan dijelaskan di tutorial php ini.
Otentikasi atau Authentication adalah proses mengkonfirmasi identitas dari seseorang atau suatu benda. Misalkan pada saat pulang ke rumah dan mengetuk pintu masuk, maka ibu Anda akan menanyakan siapa yang mengetuk pintu, sebelum mempersilahkan Anda masuk.
Otorisasi atau Authorization adalah proses memberi izin seseorang atau suatu benda untuk melakukan sesuatu. Contoh, setelah Anda dipersilahkan masuk, maka Anda akan diizikan untuk duduk di ruang tamu, menonton tv, membaca majalah di meja, masuk ke kamar tidur Anda. Namun tidak mengizinkan Anda menggunakan laptop ayah Anda atau membuka kotak penyimpanan.
Proses otentikasi & otorisasi menyangkut 4 komponen penting.
Perlu ditekankan di komponen terakhir peran . Pada saat Anda berdiri di depan pintu rumah, saat mengetuk pintu, maka peran Anda adalah "TAMU" atau "GUEST" . Setelah ibu Anda mengkonfirmasi diri Anda dan mengizinkan Anda masuk ke dalam rumah, maka peran Anda berubah menjadi "ANAK" . Jika yang mengetuk pintu ayah Anda maka setelah diizinkan masuk perannya berubah dari "TAMU" ke "KEPALA KELUARGA" . Peran inilah yang menentukan aksi apa yang boleh Anda lakukan terhadap sebuah benda. Aksi Aksi apa saja yang bisa Anda lakukan berdasarkan peran Anda sering disebut dengan hak akses .
Langkah pertama yang perlu dilakukan adalah membuat tabel yang akan digunakan pada tutorial ini. Buatlah tabel dengan nama "user" seperti di bawah:
kolom | tipe data | keterangan |
---|---|---|
user_id | varchar(40) | primary key |
name | varchar(50) | |
password | varchar(50) | |
type | varchar(20) | mencatat tipe/peran user |
CREATE TABLE `user` (
`user_id` VARCHAR(40) NOT NULL ,
`name` VARCHAR(50) NULL ,
`password` VARCHAR(50) NULL ,
`type` VARCHAR(20) NULL ,
PRIMARY KEY (`user_id`) )
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
Perlu diperhatikan di tabel di atas ada satu kolom type, kolom type digunakan untuk mencatat/menentukan peran pengguna setelah berhasil login.
Pada bagian ini akan dimulai membuat kode php untuk membatasi hak akses. Seperti dijelaskan di atas otentikasi & otorisasi menyangkut 4 komponen. Jika dikaitkan dengan contoh kode di tutorial ini maka 4 komponen tersebut adalah sebagai berikut:
Pertama buat file config.php untuk menyimpan semua konfigurasi umum seperti konfigurasi koneksi database.
<?php
if(!defined('__NOT_DIRECT')){
//mencegah akses langsung ke file ini
die('Akses langsung tidak diizinkan!');
}
define('BASE_URL', '/tutorial/multi-login/');
//koneksi database
define('DB_HOST','localhost');
define('DB_USER','root');
define('DB_PASS', 'blah');
define('DB_NAME' ,'test');
Pada baris ke-2 sampai ke-5 digunakan untuk mencegah akses langsung ke file config.php, file harus di-include oleh file lain dengan mendifinisikan konstanta __NOT_DIRECT terlebih dahulu.
Baris ke-7 adalah bagian terpenting, mendifinisikan konstanta BASE_URL jika Anda mengakses tutorial ini di browser seperti http://localhost/tutorial/multi-login/
maka BASE_URL diisi dengan /tutorial/multi-login/. Jika http://localhost/multi-login/
maka isi BASE_URL dengan /multi-login/. Tinggal hilangkan localhost, lebih mudahnya lagi jika Anda membuat tutorial ini di folder htdocs/tutorial/multi-login maka isi BASE_URL dengan tutorial/multi-login.
Baris selanjutnya adalah mendefinisikan konstanta untuk koneksi ke database.
Setelah selesai mendefinisikan konfigurasi global, selanjutnya adalah membuat file konfigurasi hak akses masing masing tipe user, halaman web mana saja yang bisa diakses setiap tipe user.
Masing masing file tersebut adalah sebagai berikut:
file admin.php
$__akses_config = array(
'login.php',
'logout.php',
'admin/index.php',
'admin/list-user.php',
'admin/add-user.php',
'admin/edit-user.php',
'admin/delete-user.php',
'admin/add-artikel.php',
'admin/edit-artikel.php',
'admin/list-artikel.php',
'admin/delete-artikel.php',
'index.php',
'view-artikel.php'
);
file user.php
<?php
$__akses_config = array(
'login.php',
'logout.php',
'admin/index.php',
'admin/add-artikel.php',
'admin/edit-artikel.php',
'admin/list-artikel.php',
'admin/delete-artikel.php',
'index.php',
'view-artikel.php'
);
file guest.php
<?php
$__akses_config = array(
'login.php',
'logout.php',
'register.php',
'index.php',
'view-artikel.php'
);
ketiga file di atas berisi satu variabel dengan nama $__akses_config dengan tipe data array, variabel $__akses_config berisi data array dari halaman halaman mana saja yang bisa diakses masing masing tipe user. Contoh admin boleh mengakses halaman admin/list-user.php sedangkan user dan guest tidak bisa, kemudian semua pengguna bisa mengakses halaman login.php.
Jumlah file di folder akses tidak terpaku hanya 3 buah, bisa ditambah sesuai dengan kebutuhan, sesuai dengan tipe user yang diinginkan.
Langkah selanjutnya adalah membuat file cek-akses.php. File ini digunakan untuk menentukan apa peran pengguna dan halaman apa saja yang bisa dikunjungi.
Pertama mencegah akses langsung ke file cek-akses.php, file harus di-include oleh file lain dengan mendifinisikan konstanta __NOT_DIRECT terlebih dahulu.
<?php
if(!defined('__NOT_DIRECT')){
//mencegah akses langsung ke file ini
die('Akses langsung tidak diizinkan!');
}
Kedua mengecek apakah user sudah login atau belum dan menentukan tipe/peran pengguna.
// ....
session_start();
include_once dirname(__FILE__).DIRECTORY_SEPARATOR.'config.php';
if(!isset($_SESSION['my_user_agent']) || ($_SESSION['my_user_agent']!=md5($_SERVER['HTTP_USER_AGENT']))){
//user belum login
$__tipe_user = 'guest';
}else{
$__tipe_user = $_SESSION['tipe_user'];
}
Membuka session di baris ke-2, baris ke-3 meng-include file config.php
yang telah dibuat sebelumnya. Baris ke-4 sampai 10 mengecek apakah pengguna sudah login, jika belum login maka tipenya adalah "guest" dan sebaliknya tipe user sesuai dengan nilai $_SESSION['tipe_user']
(sesuai dengan nilai dari tabel user).
Catatan:
Berikut penjelasan beberapa fungsi yang mungkin baru Anda ketahui:
Ketiga meng-include salah satu file yang ada di folder akses yang dibuat sebelumnya, sesuai dengan tipe pengguna yang diperoleh pada kode di atas. Jika tipe pengguna guest maka include file akses/guest.php, jika admin maka include file akses/admin.php
//.....
$aksesFilename = dirname(__FILE__).DIRECTORY_SEPARATOR.'akses'.DIRECTORY_SEPARATOR.$__tipe_user.'.php';
if(!file_exists($aksesFilename)){
die('Terjadi kesalahan sistem');
}
include $aksesFilename;
Keempat menentukan file yang sedang diakses oleh pengguna dan mengecek apakah pengguna diperbolehkan mengakses file tersebut.
//.........
$arrayCurrentPath = explode('?',$_SERVER['REQUEST_URI']);
$currentPath = substr($arrayCurrentPath[0], strlen(BASE_URL));
$allow = in_array($currentPath, $__akses_config);
Kelima jika pengguna tidak diizinkan dan pengguna belum login maka pengguna dialihkan ke halaman login (baris 28 dan 29), sebaliknya ditampilkan text "Anda tidak diizinkan mengakses halaman ini!" (baris 31).
//..........
if(!$allow){
if($__tipe_user == 'guest' && $currentPath != 'login.php'){
header("Location: ".BASE_URL.'login.php');
}else{
echo "Anda tidak diizinkan mengakses halaman ini!";
}
exit;
}
Setelah semua langkah di atas digabungkan maka file cek-akses.php akan seperti:
<?php
if(!defined('__NOT_DIRECT')){
//mencegah akses langsung ke file ini
die('Akses langsung tidak diizinkan!');
}
session_start();
require_once dirname(__FILE__).DIRECTORY_SEPARATOR.'config.php';
if(!isset($_SESSION['my_user_agent']) || ($_SESSION['my_user_agent']!=md5($_SERVER['HTTP_USER_AGENT']))){
//user belum login
$__tipe_user = 'guest';
}else{
$__tipe_user = $_SESSION['tipe_user'];
}
$aksesFilename = dirname(__FILE__).DIRECTORY_SEPARATOR.'akses'.DIRECTORY_SEPARATOR.$__tipe_user.'.php';
if(!file_exists($aksesFilename)){
die('Terjadi kesalahan sistem');
}
include $aksesFilename;
$arrayCurrentPath = explode('?',$_SERVER['REQUEST_URI']);
$currentPath = substr($arrayCurrentPath[0], strlen(BASE_URL));
$allow = in_array($currentPath, $__akses_config);
if(!$allow){
if($__tipe_user == 'guest' && $currentPath != 'login.php'){
header("Location: ".BASE_URL.'login.php');
}else{
echo "Anda tidak diizinkan mengakses halaman ini!";
}
exit;
}
Setelah membuat skrip untuk otorisasi pengguna di atas, langkah selanjutnya adalah membuat skrip untuk Otentikasi user.
Berikut adalah langkah langkah untuk membuat file login.php, langkah langkah mengotentikasi pengguna.
Pertama mendefinisikan konstanta __NOT_DIRECT
dan meng-include file cek-akses.php
defined('__NOT_DIRECT') || define('__NOT_DIRECT',1);
include 'cek-akses.php';
Kedua cek apakah pengguna sudah menginput user_id & password dan menekan tombol login, kemudian membuka koneksi ke database
//....
if($_POST){
mysql_connect(DB_HOST,DB_USER,DB_PASS);
mysql_select_db(DB_NAME);
Ketiga cek kebenaran user_id dan password yang diinput pengguna. Jika benar buat 3 session $_SESSION['tipe_user'], $_SESSION['user_id'], dan $_SESSION['my_user_agent'] dan alihkan pengguna ke halaman admin/index.php. Sebaliknya jika user_id atau password salah tampilkan pesan "ID User atau password salah!"
//..........
$userId = mysql_real_escape_string($_POST['user_id']);
$data = mysql_fetch_array(mysql_query("select * from user where user_id='".$userId."'"));
if($data !== false && $data['password'] == md5($_POST['password'])){
//login berhasil
$_SESSION['tipe_user'] = $data['type'];
$_SESSION['user_id'] = $data['user_id'];
$_SESSION['my_user_agent'] = md5($_SERVER['HTTP_USER_AGENT']);
header("Location: admin/index.php");
}else{
echo "ID User atau password salah!";
}
}?>
Keempat membuat form login
//.......
<form method="post" action="">
ID User: <input type="text" name="user_id"/>
Password: <input type="password" name="password"/>
<input type="submit" value="Login"/>
</form>
Jika digabungkan file login.php akan menjadi:
<?php
defined('__NOT_DIRECT') || define('__NOT_DIRECT',1);
include 'cek-akses.php';
if($_POST){
mysql_connect(DB_HOST,DB_USER,DB_PASS);
mysql_select_db(DB_NAME);
$userId = mysql_real_escape_string($_POST['user_id']);
$data = mysql_fetch_array(mysql_query("select * from user where user_id='".$userId."'"));
if($data !== false && $data['password'] == md5($_POST['password'])){
//login berhasil
$_SESSION['tipe_user'] = $data['type'];
$_SESSION['user_id'] = $data['user_id'];
$_SESSION['my_user_agent'] = md5($_SERVER['HTTP_USER_AGENT']);
header("Location: admin/index.php");
}else{
echo "ID User atau password salah!";
}
}
?>
<form method="post" action="">
ID User: <input type="text" name="user_id"/>
Password: <input type="password" name="password"/>
<input type="submit" value="Login"/>
</form>
Untuk menggunakan cek-akses.php sangat sederhana seperti
defined('__NOT_DIRECT') || define('__NOT_DIRECT',1);
include 'cek-akses.php';
Sekarang buatlah folder admin dan file admin/index.php, admin/add-user.php dan admin/add-artikel.php. Masing masing file ditambahkan kode di bawah di bagian paling atas.
<?php
defined('__NOT_DIRECT') || define('__NOT_DIRECT',1);
include '../cek-akses.php';
?>
Gunakanlah sql berikut untuk menambahkan user di tabel user
INSERT INTO user (user_id, name, password, type) VALUES ('admin1', 'Admin', md5('admin'), 'admin');
INSERT INTO user (user_id, name, password, type) VALUES ('test', 'Test', md5('123456'), 'user');
Sekarang akses dari browser http://localhost/multi-login/admin/index.php
maka Anda akan dialihkan ke halaman login. Masukkan user id test dan password 123456. Setelah berhasil login akses http://localhost/multi-login/admin/add-user.php
maka akan muncul text "Anda tidak diizinkan mengakses halaman ini!". Dengan langkah yang sama coba login dengan admin dan password admin, lalu akses http://localhost/multi-login/admin/add-user.php
maka Anda akan diperbolehkan mengaksesnya serta text "Anda tidak diizinkan mengakses halaman ini!" akan hilang.
Selamat mencoba