Merubah login dengan Md5 menjadi Bcrypt di Laravel 5.5

7:00 AM



Pada kesempatan kali ini saya akan share  contoh kasus yang kali ini sedang saya hadapi. Kasus yang saya hadapi cukup sederhana sebenarnya, namun sulit ketika kita menyerah (ya iyalah).

Kasusnya, saya harus merubah sebuah sistem di tempat kerja saya saat ini yang dibangun diatas PHP Native menjadi Laravel dengan versi 5.5. Dan saya terbentur di awalnya ketika beres-beres database.

Yap, pada field password, password nya di hash menggunakan MD5, sedangkan di Laravel sendiri untuk autentikasinya menggunakan Bcrypt.

Mulai searching2 di google dan mendapatkan link di laracast yang cukup sesuai dengan kasuss yang saya hadapi. Tapi, pada link tsb Laravel yang digunakan versi 5.4. Hanya ada sedikit perbedaan saja dengan yang versi 5.5.

Ok, setelah saya coba cara pada link laracast tadi, dan hasilnya gagal.

Don't Give up!

Berikut pemecahan masalahnya :

1. Pada tabel user saya rename field 'password' menjadi 'old_password'. Jadi isi pada field 'password' tadi kini berada pada field 'old_password'. Nah, lalu saya buat field baru dengan nama 'password' dengan isian null.

Lalu saya tambahkan juga field 'password_updated' untuk mengecek apakah field 'password' sudah terisi dengan password.

2. Lalu edit file 'LoginController.php'. Tambahkan script berikut ini :

public function login(Request $request)
{
$this->validateLogin($request);
// If the class is using the ThrottlesLogins trait, we can automatically throttle
// the login attempts for this application. We'll key this by the username and
// the IP address of the client making these requests into this application.
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
return $this->sendLockoutResponse($request);
}
// check if account logging in for first time
// check against old md5 password, if correct, create bcrypted updated pw
$user = User::where('nik', $request->input('nik'))->first();
if (!$user->password_updated) {
if (md5($request->input('password')) === $user->old_password) {
$user->password = bcrypt($request->input('password'));
$user->password_updated = '1';
$user->save();
} else {
return $this->sendLoginResponse($request);
}
}
if ($this->attemptLogin($request)) {
return $this->sendLoginResponse($request);
}
// If the login attempt was unsuccessful we will increment the number of attempts
// to login and redirect the user back to the login form. Of course, when this
// user surpasses their maximum number of attempts they will get locked out.
$this->incrementLoginAttempts($request);
return $this->sendFailedLoginResponse($request);
}

Jangan lupa tambahkankan script berikut diawal controller.

use Illuminate\Http\Request;
use App\User;

Jadi logikanya seperti ini.

Ketika user login,menggunakan 'nik' nya masing2, dicek user dengan nik yang dimasukkan lalu dicek apakah password sudah diupdate ke bcrypt.
Jika field password_updated null berarti password masih di hash dengan MD5. Maka cek lagi jika password yang dimasukkan pada form input dengan password yg di database yg di hash dengan MD5.
Jika sesuai, update field 'updated_password' dengan isian 1. dan update field 'password' dengan password yang di hash menggunakan Bcrypt.

Selesai.



You Might Also Like

1 comments