Senin, 17 April 2023

Panduan Lengkap: Bagaimana Cara Impersonate User di Laravel

Dalam artikel ini kita akan belajar untuk mencoba impersonate user, kita akan mulai step by step disini, dari kita buat user dan juga seorang admin.

Package
Laravel

Dalam artikel ini kita akan belajar untuk mencoba impersonate user, kita akan mulai step by step disini, dari kita buat user dan juga seorang admin.

Instalasi

Pertama, mari kita lakukan instalasi laravel nya sekalian dengan breeze nya.

Terminal
laravel new project --breeze

Silakan pilih stack menggunakan blade saja agar kita bisa lebih general disini.

Setelah itu, mari kita lakukan instalasi package yang dibuat oleh 404labfr dengan perintah berikut:

Terminal
composer require lab404/laravel-impersonate

Kemudian setelah itu, buka app/Models/User.php untuk memasukkan trait yang telah diberikannya seperti:

app/Models/User.php
use Lab404\Impersonate\Models\Impersonate;
class User extends Authenticatable
{
    use Impersonate;
    
    //...
}

Implementasi

Untuk mengimplementasikan package ini ada 2 pilihan. Bisa dengan membuat controller sendiri, atau menggunakan built-in controller dari package ini.

Controller Sendiri

Untuk jelas saja, jika Anda ingin menggunakan controller sendiri, pastinya Anda akan membuat route sendiri juga, dan itu pasti repot. Makanya ada opsi yang kedua, namun jika Anda tetap ingin menggunakan controller sendiri, entah itu karena ada api tambahan yang Anda ingin jalankan. Maka Anda bisa pakai api seperti berikut:

Auth::user()->impersonate($other_user);

Itu adalah kode untuk mengimpersonate user, nah kemudian jika ingin keluar dari impersonating nya bisa dengan:

Auth::user()->leaveImpersonation();

Built-in Controller

Nah, jika Anda ingin menggunakan built-in controller, Anda bisa masukkan route nya langsung di routes/web.php seperti berikut:

routes/web.php
Route::impersonate();

Dengan begitu, jika Anda lihat list route nya dengan menjalankan perintah:

Terminal
php artisan route:list

Maka route untuk impersonate.leave dan impersonate akan sudah ada di list tersebut.

Impersonation authorization

Mungkin Anda ingin menentukan, role apa saja yang boleh mengimpersonate user, entah itu misalnya admin, moderator dan sebagainya. Untuk itu, kita bisa tambahkan itu pada model User seperti:

app/Models/User.php
use Lab404\Impersonate\Models\Impersonate;
class User extends Authenticatable
{
    use Impersonate;

    // ...

    public function isAdmin(): bool
    {
        return $this->id === 1;
    }

    public function canImpersonate(): bool
    {
        return $this->isAdmin();
    }
}

Atau mungkin sebaliknya, semua boleh di impersonate kecuali seoarang Admin, maka untuk itu kita bisa tambahkan method canBeImpersonated seperti berikut:

app/Models/User.php
use Lab404\Impersonate\Models\Impersonate;
class User extends Authenticatable
{
    use Impersonate;

    // ...

    public function isAdmin(): bool
    {
        return $this->id === 1;
    }

    public function canImpersonate(): bool
    {
        return $this->isAdmin();
    }
    
    public function canBeImpersonated(): bool
    {
        return ! $this->isAdmin();
    }
}

Mari Kita Coba

Sekarang, Anda bisa buka tinker dengan menjalakan php artisan tinker, kemudian lakukan factory untuk user seperti:

Terminal
> App\Models\User::factory(10)->create();

Untuk masalah Admin, karena kita gk mempunyai setup nya, jadi kita akan menganggap bahwa admin adalah user yang mempunyai id = 1. Sesuai dari logic yang kita buat pada model user tadi.

Sekarang, Anda bisa jalankan php artisan serve (jika Anda tidak memakai valet). Kemudian Anda bisa login dengan dulu dengan user yang telah kita buat pada tinker tadi. Pastikan Anda sedang meloginkan user yang mempunyai id 1, karena dalam konteks di atas tadi, kita hanya mengizinkan admin untuk mengimpersonate user.

Setelah Anda login, Anda bisa kunjungi url 127.0.0.1:8000/impersonate/take/2, 2 itu adalah id dari user yang ingin kita impersonate. Jika Anda sudah mengunjungi url itu, maka harusnya Anda akan sudah login dengan user yang mempunyai id 2.

Sekarang kita akan langsung belajar bagaimana cara keluar dari impersonate itu, harusnya ini akan sangat mudah.

Buka file navigation.blade.php, dan silakan tambahkan kode tepat sebelum tag nav seperti:

resources/views/layouts/navigation.blade.php
@impersonating($guard = null)
    <a href="{{ route('impersonate.leave') }}" class='bg-blue-600 text-white px-4 py-3 text-center block font-medium'>
        Leave impersonation
    </a>
@endImpersonating

<nav x-data="{ open: false }" class="bg-white border-b border-gray-100">

Harusnya sekarang tampilannya kurang lebih akan seperti ini:

Screenshot impersonating user parsinta.com

Jika sekarang kita klik tombol biru di atas navigasi itu, maka harusnya kita sudah keluar dari user yang sedang kita impersonate.

Semoga artikel ini bermanfaat ya, jika Anda ingin mempelajari lebih lanjut tentang package ini. Maka Anda bisa lihat langsung disini. Saya Irsyad, see you.