Membuat login yang sederhana di php bukanlah hal yang sulit hanya membutuhkan form, user, autentikasi dan sudah. Namun untuk aplikasi kelas menengah ke atas, keberadaan modul login harus dibuat bukan biasa-biasa saja, karena login bisa menjadi pintu kelemahan aplikasi, membiarkan orang lain masuk dengan mudah. Oleh karena itu fitur-fitur login harus lengkap dan tentunya menerapkan standar security yang tinggi. Tapi untuk membuat login yang aman dan powerfull bukanlah hal mudah pula, karena perlu mempertimbangkan fitur yang saling terkait sehingga berimbas developmentnya menjadi lebih lama.
Logsys dapat menjadi pertimbangan bagi developer yang butuh menerapkan sistem login yang aman dan powerfull, karena menerapkan security berupa PDO dan hashes, selain itu sudah dilengkapi fungsi-fungsi berupa fitur yang lengkap. Beberapa diantaranya fitur Logsys :
- Login dan Register
- Fitur Remember Me
- Secure (mengggunakan PDO & hashes)
- Fitur “Forgot Password ?”
- Fungsi ubah password
- Field tambahan yang bisa ditambahkan pada informasi user
- Tool tambahan seperti validasi email dan Random String generator
- Dapat dengan mudah detail mengenai user
- Auto-redirect berdasarkan status user
- Informasi waktu user joined
- Proteksi dari Brute Force
- Fitur login attempts
- dsb
Logsys ini di develop oleh Subin Siby dan dimaintain dengan baik olehnya, karena sejak pertama kali dirilis hingga kini selalu memiliki update. Anda dapat mendownload Logsys di sini
Berikut ini beberapa cara untuk menggunakan Logsys.
1. Setelah Anda mendownload Logsys, maka anda memerlukan file class.logsys.php
2. Anda perlu membuat table “users” (tidak harus users, namun defaultnya adalah users).
3. Setelah itu untuk struktur table users kurang lebih memiliki field seperti :
1 id | username | email | password | password_salt | name | created | attempt
Anda dapat memilih menggunakan username atau email sebagai login. Sebenarnya core nya dari field itu tentu username, password, dan password_salt sisanya adalah opsional yang tentunya diperlukan sesuai fungsinya. Misal attempt tentu untuk menentukan brute force apakah sedang dilakukan.
Fungsi balikan dari logsys kebanyakan berupa boolean, jadi jika perlu melakukan validasi value, disarankan menggunakan operator “===” dibandingkan “==”.
4. Selanjutnya kita melakukan konfigurasi pada logsys ini pada file. Berikut konfigurasi yang dapat dilakukan :
section | Option | Description | Example |
info | company | Your site/company name. Used for including in E-Mails to be sent | blog name |
Used for “From” header in E-Mails sent | my_address@email.com | ||
db | host | The MySQL Database Hostname. | localhost |
port | The MySQL Database Port | 3306 | |
username | The MySQL Database Username | root | |
password | The MySQL Database Password for the username given | mypassword | |
name | The Database Name | projects | |
table | The Database Table where you want to store users’ data | users | |
keys | cookie | A Secure Key that is used to encrypt cookie values | sadauj3n(#ff)#%$ |
salt | The common password salt (site salt) that is used to encrypt all the users’ password when creating an account. | vdsjn3md%##$*5 | |
features | start_session | Should the class call session_start(); | true (boolean) |
email_login | Should the class allows logging in with both E-Mail & Username ? | true (boolean) | |
remember_me | If value is provided to \Fr\LS::login(), should user be automatically logged in even after the end of PHP session. | true (boolean) | |
auto_init | Should \Fr\LS::init() be ran automatically on the first logSys function called in any page ? | false (boolean) | |
block_brute_force | Prevent Brute Forcing. By enabling this, logSys will deny login for the time mentioned in the config value “brute_force”->”time_limit” seconds after config value “brute_force”->”tries” incorrect login tries. |
true | |
brute_force | tries | Number of login tries alloted to users | 5 |
time_limit | The time IN SECONDS for which block from login action should be done after incorrect login attempts. Use this tool for converting minutes to seconds. Default : 5 minutes | 300 | |
pages | no_login | An array containing the relative path name of pages that doesn’t require logging in like the index page of site | array(“/”) |
login_page | The relative path name of login Page | /login.php | |
home_page | The relative path name of home page that the class should redirect to after logging in | /home.php | |
cookies | expire | The expire time of the 2 cookies created during login process. This value is used for making the time using strtotime() function. So, the value must be compatible withstrtotime() | +30 days |
path | The `path` value of cookies. | / | |
domain | The `domain` value of cookies. See setcookie() | domain.com |
Pastikan pada section keys, anda menggunakan cookie dan hash yang berbeda dan tidak ada yang mengetahuinya.
5. Selanjutnya Anda perlu melakukan setup database seperti field yang tadi disebutkan, menjadi kurang lebih seperti ini:
1
2
3
4
5
6
7
8
9
10
11 CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`email` tinytext NOT NULL,
`password` varchar(64) NOT NULL,
`password_salt` varchar(20) NOT NULL,
`name` varchar(30) NOT NULL,
`created` datetime NOT NULL,
`attempt` varchar(15) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
Ingat anda tidak perlu berpatokan pada struktur ini, Anda dapat menambahkan atau mengurangi setidaknya core field yang dibutuhkan tersedia.
Jika Anda memerlukan fitur untuk “Lupa password”, maka Anda perlu menambahkan satu table lagi dengan nama resetTokens dengan struktur sql seperti ini :
1
2
3
4
5 CREATE TABLE IF NOT EXISTS `resetTokens` (
`token` varchar(40) NOT NULL COMMENT 'The Unique Token Generated',
`uid` int(11) NOT NULL COMMENT 'The User Id',
`requested` varchar(20) NOT NULL COMMENT 'The Date when token was created'
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Untuk nama table ini disarankan Anda tidak mengubahnya, karena jika Anda ingin menggunkan nama lain, maka Anda perlu mengganti nama table resetTokens dalam file logsys dengan nama table Anda.
6. Untuk inisialisasi Logsys, anda cukup menjalankan seperti ini :
1
2
3
4 <?php
require "class.logsys.php";
\Fr\LS::init();
?>
7. Sekarang kita buat satu tampilan sederhana untuk login seperti ini :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 <html>
<head>
<title>Log In</title>
</head>
<body>
<div class="content">
<form method="POST">
<label>Username / E-Mail</label><br/>
<input name="login" type="text"/><br/>
<label>Password</label><br/>
<input name="pass" type="password"/><br/>
<label>
<input type="checkbox" name="remember_me"/> Remember Me
</label>
<button name="act_login">Log In</button>
</form>
</div>
</body>
</html>
8. Lalu untuk prosesnya seperti ini :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 <?php
require "config.php";
\Fr\LS::init();
if(isset($_POST['action_login'])){
$identification = $_POST['login'];
$password = $_POST['password'];
if($identification == "" || $password == ""){
$msg = array("Error", "Username / Password Wrong !");
}else{
$login = \Fr\LS::login($identification, $password, isset($_POST['remember_me']));
if($login === false){
$msg = array("Error", "Username / Password Wrong !");
}else if(is_array($login) && $login['status'] == "blocked"){
$msg = array("Error", "Too many login attempts. You can attempt login after ". $login['minutes'] ." minutes (". $login['seconds'] ." seconds)");
}
}
}
?>
Sintaks yang digunakan untuk menggunakan fungsi $LS->login() seperti ini :
1 \Fr\LS::login($username, $password, $remember_me, $cookies)
Jadi fungsi diatas akan menghasilkan balikan boolean TRUE jika berhasil, dan balikan FALSE jika gagal. Parameter $remember_me defaultnya adalah FALSE, namun jika Anda akan menggunakan fitur remember_me Anda harus mensetnya TRUE dan juga tentunya di konfigurasi awal harus diaktifkan, maka selanjutnya akan terus aktif walau session user sudah ditutup. Sedangkan parameter $cookies defaultnya sudah aktif, karena menentukan cookies akan otomatis dibuat ketika user login.
Bisa dibilang dengan cara diatas Anda sudah menjalankan login yang Aman dan powerfull. Tapi bagaimana membuat usernya? Oke ini caranya untuk register user. Caranya pun cukup simpel seperti diatas.
Caranya dengan memanggil sintaks fungsi $LS->register() seperti ini :
1 \Fr\LS::register($username, $password, $extraValues);
Pada parameter $extraValues merupakan array yang berisi key dan value yang diinput bersamaan dengan username dan password. Contoh seperti ini :
1 array("name" => $personName)
Nah, jika data array yang dilewatkan lebih dari satu, maka seperti ini :
1 array("email" => $email, "name" => $name)
Sebagai catatan, nama field di database haruslah sama dengan key yang anda lewat di array extraValues.
Oke sebagai tambahan fitur-fitur yang biasanya tersedia pada modul login
Cek User sedang login :
1
2
3
4
5 <span class="identifier"><span class="keyword">if</span></span>(\Fr\LS::$<span class="identifier">loggedIn</span>){
<span class="regexp"> //</span> <span class="constant">User</span> <span class="identifier">logged</span> <span class="identifier"><span class="keyword">in</span></span>
}else{
<span class="regexp"> //</span> <span class="constant">User</span> not <span class="identifier">logged</span> <span class="identifier"><span class="keyword">in</span></span>
}
Cek User sudah ada atau tidak :
1 \Fr\LS::userExists($username)
Fungsi Logout :
1 \Fr\LS::logout();
Fungsi Ganti Password :
1 \Fr\LS::changePassword($current_password, $new_password);
Fungsi Detail Info User :
Jika hanya memerlukan field tertentu
1 \Fr\LS::getUser("column_name", $userID);
Tapi jika Anda perlu semua data, maka Anda dapat melakukan “*”, seperti ini :
1
2
3
4
5
6
7 Array(
"id" => 1,
"username" => "username",
"email" => "mail@email.com",
"password" => "asd4845ghnvbmvolfpsdpsa0ffkfoeww89d9d25f1f56",
"password_salt" => "mv5r7(4565v"
)
Fungsi Update user :
1 \Fr\LS::updateUser($values, $userID);
Fungsi update user ini berdasarkan userid, sementara parameter values berisi array data yang ingin diupdate seperti ini :
1
2
3
4 \Fr\LS::updateUser(array(
"name" => "user",
"birth" => "20/01/2000"
));
Cukup banyakan?. Masih ada lagi fungsi lain yang bisa digunakan. Lebih banyak lagi Anda dapat mengunjungi websitenya : http://subinsb.com/php-logsys