Laravel Redirect Ke Page Yang dituju Setelah Login

15 Maret 2020

Pernah kah membuka page url yang mengharuskan login terlebih dahulu, sehingga jika belum login akan diredirect ke login page ?

Nah bagaimanakan cara agar setelah login bisa kembali ke page yang dituju tadi?

Biasanya website akan menambahkan page yang dituju sebagai param. Seperti dibawah ini contohnya. Di laravel kita menyebutnya Intended Redirect

Kabar baiknya Laravel sudah menyediakan fitur tersebut. Plus tidak ada param di url, sehingga url tetap clean.

Jika kamu penasaran kenapa laravel bisa melakukan itu, kita pelajari lebih dalam di artikel ini.

Setelah mengerti apa yang akan kita buat, langsung saja ke pembahasannya. Saya anggap teman teman sudah mengerti cara membuat auth di laravel yaa, karena ini bukan tutorial membuat auth :D

Yang Harus Dilakukan

Untuk membuat intended redirect bekerja, maka yang harus dilakukan ada2 yaitu:

  1. Melakukan redirect guest ketika user belum login / tidak ter-autentikasi
  2. Melakukan redirect intended ketika user sudah berhasil login / ter-autentikasi

Setelah mengetahui yang harus dilakukan, mari kita memahami workflow nya atau cara kerjanya

Memahami Cara Kerjanya

Ketika kita melakukan redirect guest yang terjadi adalah, laravel akan membuat session dengan valuenya adalah URL yang kita tuju sebelumnya.

Hal ini bisa dilihat di Illuminate/Routing/Redirector@guest, perhatikan method yang dipanggil setelah pengecekan $intended adalah setIntendedUrl().

Yang jika ditelusuri adanya $this->session->put() berfungsi untuk menyimpan session dengan value URL yang sudah dituju sebelumnya.

Baris terakhir dari Illuminate/Routing/Redirector@guest lah yang melakukan redirect ke path yang diinginkan, biasanya ke login page.

Nahh, ketika session sudah dibuat maka sekarang tugas intended untuk melakukan redirect, bisa dilihat di Illuminate/Routing/Redirector@intended, melakukan pemanggilan session dengan key yang sudah diset tadi dan me-redirect ke url yang sesuai.

Sekarang sudah mengerti ya kenapa bisa terjadi redirect ke page yang dituju tanpa embel-embel parameter di url.

Mari Kita Buat

Secara default, ketika kita tidak melakukan modifikasi pada Authenticate Middleware yang terletak pada app/Http/Middleware/Authenticate.php maka sudah ada redirect guest seperti yang saya jelaskan tadi,

Namun terkadang kita melakukan modifikasi misal untuk checking role, seperti ini misalnya

app/Http/Middleware/Authenticate.php
public function handle($request, Closure $next, ...$roles)
{
    if (empty($roles)) {
        throw new InvalidArgumentException('Role need to be configured, but null given');
    }

    $auth = $this->auth->guard();

    if ($auth->check()) {
        if (in_array($auth->user()->role, $roles)) {
            return $next($request);
        }
    }

    $this->unauthenticated($request, $roles);
}

Maka yang wajib adalah pemanggilan method $this->unauthenticated(), karena method tersebut akan throw exception yang pada akhirnya juga memanggil redirect guest seperti yang sudah saya jelaskan tadi.

Yang perlu diperhatikan adalah pada bagian return. Agar intended redirect ini bekerja maka harus menggunakan redirect guest()

Selanjutnya adalah konfigurasi pada controller yang menangani auth dan pastikan menggunakan redirect intended() seperti ini contohnya

AuthController.php
public function auth(AuthRequest $request)
{
    if (Auth::guard('admin')->attempt(['email' => $email, 'password' => $password])) {
        return redirect()->intended('/admin');
    }
}

Jika sudah seperti itu, pastilah akan work redirect ke page yang dituju.

Kesimpulan

Pada intinya untuk melakukan hal ini adalah menyimpan session ketika user belum login dan melakukan redirect kembali ketika user sudah berhasil login.

Semoga penjelasan saya bisa kamu pahami, selamat mencoba. Jika ada pertanyaan silahkan menghubungi saya melalui sosmed, link nya ada di footer halaman ini.