Cara Mengubah Redirect Login Dengan Jetstream Atau Fortify - CRUDPRO

Cara Mengubah Redirect Login Dengan Jetstream Atau Fortify

Baru-baru ini, saat mengerjakan proyek menggunakan Laravel Jetstream, saya menemukan skenario di mana saya perlu mengarahkan pengguna ke rute lain tergantung pada tipe pengguna saat login. Misalkan Anda memiliki pengguna dan administrator biasa, dan administrator memiliki dasbor khusus yang hanya dapat Anda lihat. Saya biasanya lebih suka menentukan dasbor khusus saat administrator masuk.

Dengan Laravel Jetstream atau Fortify, saya tidak langsung tahu bagaimana melakukan ini, terutama saat menggunakan otentikasi dua faktor.

Mekanisme otentikasi dengan Jetstream dan Fortify

Jetstream menggunakan Laravel Fortify secara internal, sehingga proses aplikasi yang menjalankan Fortify saja dan proyek yang menjalankan Jetstream sama persis.

Fortify menggunakan pipa tindakan untuk merutekan setiap permintaan melalui sekumpulan kelas yang menangani satu tugas, seperti mencoba mengautentikasi pengguna atau mengarahkan pengguna saat otentikasi dua faktor dikonfigurasi.

Bagaimana mengubah prosedur pengalihan

Fortify memungkinkan Anda untuk sepenuhnya menyesuaikan pipa ini dengan kebutuhan Anda, tetapi ada cara mudah untuk mengganti prosedur pengalihan.

Langkah terakhir dalam pipeline otentikasi mendapatkan kelas `Laravel\Fortify\Contracts\LoginResponse` dari wadah layanan dan mengembalikannya. Artinya, Anda dapat mengganti kelas `LoginResponse` dengan kelas `LoginResponse` kustom Anda sendiri dan melakukan pengalihan kustom di sana.

Kelas `LoginResponse` default terlihat seperti ini:

<?php
namespace Laravel\Fortify\Http\Responses;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
class LoginResponse implements LoginResponseContract
{
   /**
     * Create an HTTP response that represents the object.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function toResponse($request)
    {
        return $request->wantsJson()
            ? response()->json(['two_factor' => false])
            : redirect()->intended(config('fortify.home'));
    }
} 
Prosedur `LoginResponse` sangat bersih dan sederhana, karena Fortify menggunakan tindakan yang melakukan satu tugas.

Untuk menyesuaikan pengalihan, pertama-tama tambahkan kelas `LoginResponse` khusus ke direktori `app/Http/Responses` Anda. Anda kemudian dapat menyesuaikan metode `toResponse` untuk mengarahkan pengguna ke rute yang berbeda tergantung pada jenis pengguna.

<?php
namespace App\Http\Responses;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
class LoginResponse implements LoginResponseContract
{
    /**
     * @param  $request
     * @return mixed
     */
    public function toResponse($request)
    {
        $home = auth()->user()->is_admin ? '/admin' : '/dashboard';
        return redirect()->intended($home);
    }
}

Selanjutnya, di `FortifyServiceProvider`, Anda perlu mengikat kelas `LoginResponse` khusus untuk mengganti default yang disediakan oleh Fortify.

<?php
namespace App\Providers;
// ...
use App\Http\Responses\LoginResponse;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
class FortifyServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // ...
        $this->app->singleton(LoginResponseContract::class, LoginResponse::class);
    }
}

Otentikasi dua faktor

Ini bekerja hampir sempurna untuk kebutuhan saya. Ada satu otentikasi bagian-dua-faktor yang hilang. Saat pengguna masuk dengan otentikasi dua faktor diaktifkan, Fortify mengembalikan kelas respons lain. Untungnya, kelas otentikasi dua faktor juga terikat ke wadah layanan. Kali ini, kita perlu mengganti kelas Laravel\Fortify\Http\Responses\TwoFactorLoginResponse` di dalam container. Menambahkan beberapa baris lagi ke `FortifyServiceProvider` akan berfungsi.

<?php
namespace App\Providers;
// ...
use App\Http\Responses\LoginResponse;
use Laravel\Fortify\Contracts\LoginResponse as LoginResponseContract;
use Laravel\Fortify\Contracts\TwoFactorLoginResponse as TwoFactorLoginResponseContract;
class FortifyServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // ...
        $this->app->singleton(LoginResponseContract::class, LoginResponse::class);
        $this->app->singleton(TwoFactorLoginResponseContract::class, LoginResponse::class);
    }
}

Catatan: Saya mengganti kelas `TwoFactorLoginResponse` dengan kelas `LoginResponse` kustom yang sama karena fungsinya harus sama persis.

Ganti fungsi Jetstream dan Fortify lainnya

Jetstream dan fitur Fortify lainnya dapat dikustomisasi dengan cara yang sangat mirip. Jika Anda membuka `FortifyServiceProvider` (bukan khusus proyek) yang berisi sumber dan gulir ke bawah ke metode `registerResponseBindings`, Anda akan melihat sesuatu seperti ini:

<?php
namespace Laravel\Fortify;
// ...
class FortifyServiceProvider extends ServiceProvider
{
    // ...
    /**
     * Register the response bindings.
     *
    * @return void
     */
    protected function registerResponseBindings()
    {
        $this->app->singleton(FailedPasswordConfirmationResponseContract::class,FailedPasswordConfirmationResponse::class);
       $this->app->singleton(FailedPasswordResetLinkRequestResponseContract::class, FailedPasswordResetLinkRequestResponse::class);
        $this->app->singleton(FailedPasswordResetResponseContract::class, FailedPasswordResetResponse::class);
        $this->app->singleton(FailedTwoFactorLoginResponseContract::class, FailedTwoFactorLoginResponse::class);
        $this->app->singleton(LockoutResponseContract::class, LockoutResponse::class);
        $this->app->singleton(LoginResponseContract::class, LoginResponse::class);
        $this->app->singleton(TwoFactorLoginResponseContract::class, TwoFactorLoginResponse::class);
        $this->app->singleton(LogoutResponseContract::class, LogoutResponse::class);
        $this->app->singleton(PasswordConfirmedResponseContract::class, PasswordConfirmedResponse::class);
        $this->app->singleton(PasswordResetResponseContract::class, PasswordResetResponse::class);
        $this->app->singleton(RegisterResponseContract::class, RegisterResponse::class);       
        $this->app->singleton(SuccessfulPasswordResetLinkRequestResponseContract::class, SuccessfulPasswordResetLinkRequestResponse::class);
    }
    // ...
}

Artinya, masing-masing kelas respons ini dapat diganti dalam proyek sesuai kebutuhan.

Sumber Referensi : Dokumentasi Resmi Laravel