Beberapa website menerapkan Captcha pada halaman login mereka untuk memastikan bahwa permintaan login dilakukan oleh manusia bukan bot. Sebagian orang mungkin akan terganggu dengan kemunculan Captcha ini jika mereka harus menyelesaikan captcha dari pertama percobaan login. Oleh karena itu, Pada tutorial kali ini kita akan membahas bagaimana cara menampilkan captcha pada halaman login jika pengguna gagal login berkali-kali pada Laravel.
Sebelum masuk pada inti pembahasan tutorial ini, Jika anda belum tahu cara implementasi google reCaptcha silahkan baca terlebih dahulu tutorial dibawah ini:
Memunculkan Captcha
Pada tutorial ini kita akan menampilkan captcha pada halaman login jika pengguna gagal login berkali-kali. Hal pertama yang harus kita lakukan untuk memenuhi kasus ini, kita harus mengetahui berapa kali proses login yang gagal dilakukan oleh pengguna. Laravel akan mengeksekusi method sendFailedLoginResponse
pada trait AuthenticatesUsers ketika pengguna gagal login. Kita akan memanfaatkan method ini untuk menghitung jumlah gagal login yang telah dilakukan.
Override method sendFailedLoginResponse
Untuk menyimpan jumlah login yang gagal kita harus mengoverride method sendFailedLoginResponse
pada class LoginController. Kita akan memanfaatkan session untuk menyimpan jumlah login yang telah dilakukan oleh pengguna.
protected function sendFailedLoginResponse(Request $request) { $request->session()->increment('login_attempts'); throw ValidationException::withMessages([ $this->username() => [trans('auth.failed')], ]); }
Pada method diatas terlihat bahwa kita menyimpan sebuah angka pada session dengan key login_attempts
yang mana nilainya akan naik terus ketika login gagal.
Memeriksa jumlah login gagal
Untuk mendapatkan jumlah login yang gagal kita bisa menggunakan method get dari session helper laravel.
session()->get('login_attempts')
Karena kita akan menampilkan captcha hanya pada saat gagal login sebanyak n kali, kita akan membuat sebuah method dengan nama shouldDisplayCaptcha
untuk memeriksa apakah gagal login sudah memenuhi syarat untuk captcha ditampilkan?
Masih pada class LoginController tambahkan method dibawah ini. Silahkan ganti angka 2 sesuai dengan kebutuhan.
private function shouldDisplayCaptcha() { return session()->get('login_attempts', 0) > 2; }
Menampilkan captcha pada view
Untuk menampilkan captcha pada view, pertama kita harus mengirimkan hasil dari method shouldDisplayCaptcha
ke view. Untuk mengirimkan data ke view login kita harus mengoverride method showLoginForm
pada class LoginController.
public function showLoginForm() { return view('auth.login', [ 'displayCaptcha' => $this->shouldDisplayCaptcha(), ]); }
Langkah selanjutnya, kita harus menambahkan captcha pada view login.blade.php
@if ($displayCaptcha) <div class="form-group row"> <div class="col-md-6 offset-md-4"> {!! NoCaptcha::renderJs() !!} {!! NoCaptcha::display() !!} @error('g-recaptcha-response') <span class="invalid-feedback d-block" role="alert"> <strong>{{ $message }}</strong> </span> @enderror </div> </div> @endif
Pada proses ini halaman login pada project Laravel kita akan terlihat kurang lebih seperti ini.

Validasi Captcha
Langkah selanjutnya yang harus dilakukan adalah memastikan bahwa captcha di validasi dengan benar. Pada proses Login laravel menggunakan method validateLogin
pada trait AuthenticatesUsers, kita harus mengoverride method ini pada class LoginController.
protected function validateLogin(Request $request) { $rules = [ $this->username() => 'required|string', 'password' => 'required|string', ]; if ($this->shouldDisplayCaptcha()) { $rules['g-recaptcha-response'] = 'required|captcha'; } $request->validate($rules); }
Jika proses diatas selesai dilakukan, silahkan coba untuk login hingga reCaptcha muncul pada halaman login, kemudian coba untuk tidak menceklis reCaptcha pada halaman login.

No Comments
Leave a comment Cancel