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.

3 min read

Published on 17 Apr

Written by Irsyad A. Panjaitan

Fill in PackageLaravel

ArticlesCara 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.

Instalasi

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

laravel new project --breeze
bashCopy

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:

composer require lab404/laravel-impersonate
bashCopy

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; //... }
phpCopy

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);
phpCopy

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

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

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();
phpCopy

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

php artisan route:list
bashCopy

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(); } }
phpCopy

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(); } }
phpCopy

Mari Kita Coba

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

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

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">
htmlCopy

Harusnya sekarang tampilannya kurang lebih akan seperti ini:

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.

Irsyad A. Panjaitan

Let's start living like no one can help us in any event, so that when we are helped in certain times, it becomes a plus in itself.
0

Share on