1. Laravel
  2. PHP

Laravel – Menampilkan Captcha jika gagal login berkali-kali

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.

Laravel - Memunculkan Captcha jika gagal login berkali-kali

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.

Laravel - Memunculkan Captcha jika gagal login berkali-kali

Comments to: Laravel – Menampilkan Captcha jika gagal login berkali-kali

    Your email address will not be published. Required fields are marked *

    Attach images - Only PNG, JPG, JPEG and GIF are supported.