Tanggal :11 September 2024
Belajar Laravel Roles & Permission

Belajar Laravel Roles & Permission

Assalamualaikum Warohmatulloh Wabarokatuh, memang banyak cara untuk membedakan level user pada aplikasi yang kita bangun dengan Laravel. Jika sebelumnya sudah sempat kita bahas tentang Laravel Multi Auth dengan menggunakan tabel berbeda. Kali ini kita akan belajar tentang konsep roles & permission menggunakan package Laravel Role & Permission.

Instal Laravel Roles & Permission

Karena kita menggunakan package, maka kita harus menginstal terlebih dulu. Ohya, saya asumsikan kawan-kawan sudah punya proyek Laravel yang masih baru & sudah melakukan konfigurasi untuk database dan sudah menjalankan auth scaffolding Laravel.

composer require spatie/laravel-permission

Setelah terinstal, langkah berikutnya adalah kita menerbitkan file migrations dari package ini.

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

Berikutnya, jalankan migrationnya.

php artisan migrate

Setelah dijalankan maka akan ada beberapa tabel yang dibuat oleh migration dari package ini.

Penggunaan

Pertama setelah melakukan proses instalasi. Untuk menggunakan package Laravel Permission ini kita tambahkan dulu trait HasRoles ke model User.

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}

Dalam tulisan ini, saya akan langsung berikan contoh praktikal yang biasa saya lakukan ketika membangun sebuah proyek yang membutuhkan pembagian level user.

Pertama, yang saya lakukan adalah membuat sebuah seeder untuk mendefinisikan roles apa saja yang tersedia dalam proyek nantinya.

php artisan make:seeder RoleSeeder

Setelah RoleSeeder dibuat, selanjutnya buat kode seperti ini untuk mendefinisikan role yang kawan-kawan butuhkan. Pada contoh ini saya akan buat dua role yaitu admin dan user.

<?php

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;

class RoleSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        Role::create([
            'name' => 'admin',
            'guard_name' => 'web'
        ]);

        Role::create([
            'name' => 'user',
            'guard_name' => 'web'
        ]);
    }
}

Setelah membuat seeder untuk role, berikutnya kita akan buat 2 user dengan masing-masing role yang ada. Buat seeder untuk user.

php artisan make:seeder UserSeeder

Kemudian, tambahkan tulis kode ke dalam UserSeeder seperti yang di bawah ini. Fungsinya untuk membuat user dan memberi sebuah role.

<?php

use App\User;
use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $admin = User::create([
            'name' => 'Admin',
            'email' => 'admin@kawankoding.id',
            'password' => bcrypt('12345678'),
        ]);

        $admin->assignRole('admin');

        $user = User::create([
            'name' => 'User',
            'email' => 'user@kawankoding.id',
            'password' => bcrypt('12345678'),
        ]);

        $user->assignRole('user');
    }
}

Setelah itu, untuk mempermudah proses seeding, panggil seeder yang dibuat tadi ke dalam class DatabaseSeeder.

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(RoleSeeder::class);
        $this->call(UserSeeder::class);
    }
}

Perlu diperhatikan dalam memanggil seeder dahulukan RoleSeeder, karena pada UserSeeder ada proses assignRole yang membutuhkan nilai dari data pada tabel roles.

Kemudian, mari jalankan seedernya.

php artisan db:seed
Seeder Roles & User
RoleSeeder & UserSeeder

Setelah seeder dijalankan maka akan ada 3 tabel yang terisi data. Yaitu tabel roles, users dan model_has_roles.

Belajar Laravel Roles & Permission
Tabel roles
Belajar Laravel Roles & Permission
Tabel users
Tabel model_has_roles

Sedikit penjelasan tentang tabel model_has_roles adalah model pivot untuk relasi Many to Many Polymorphic di Laravel. Intinya roles bisa digunakan dengan relasi ke model lainnya selain model User. misal kawan-kawan punya model Admin kita bisa juga gunakan trait HasRoles di model Admin.

Membedakan Redirect Ketika Login

Setelah punya data user yang memiliki role. Kebutuhan selanjutnya adalah memisahkan redirect user yang berhasil login sesuai role masing-masing.

Baiklah, mari kita buat route yang akan kita gunakan untuk redirect user berdasarkan role yang dimiliki. Sebelumnya, kita daftarkan dulu middleware dari spatie/laravel-permission untuk melindungi route berdasarkan role.

Tambahkan middleware ke dalam file app/Http/Kernel.php.

protected $routeMiddleware = [
    // ...
    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
    'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
    'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];

Kemudian mari kita buat route di file routes/web.php.

Route::get('admin-page', function() {
    return 'Halaman untuk Admin';
})->middleware('role:admin')->name('admin.page');

Route::get('user-page', function() {
    return 'Halaman untuk User';
})->middleware('role:user')->name('user.page');

Oke, sekarang waktunya kita beraksi, ada beberapa cara untuk melakukan pengecekan dan membedakan redirect dari user. Kita gunakan cara paling mudah dan yang biasa saya gunakan. Buka file app/Http/Controllers/Auth/LoginController.php. Kemudian kita akan override method authenticated yang ada di berada trait AuthenticatesUsers. Oke, jadi tambahkan kode ini di LoginController.

public function authenticated(Request $request, $user)
{
    if ($user->hasRole('admin')) {
        return redirect()->route('admin.page');
    }

    return redirect()->route('user.page');
}

Dan jangan lupa untuk menambahkan use Illuminate\Http\Request; biar gak error :P.

Sudah selesai ? sekarang coba akses halaman login (http://localhost:8000/login) dan gunakan masing-masing data user untuk login.

Yaudah, ngapain lanjut baca? dirusuh nyoba kok malah baca :p. Praktekin tuh bisa nggak wkwkw. Percuma baca doang kalo ga dipraktekin :P.

Wassalamualaiikum Warrohmatulloh Wabarokatuh.

Hai semua, saya Amirul seorang Software Engineer, suka membuat konten pembelajaran berupa artikel, video tutorial maupun podcast

50 Comments

  1. Praditya Nafiis Muhammad

    Assalamualaikum Mas. Mohon maaf saya ingin bertanya. Saya ingin membuat proyek toko online. Ada role customer, employee, dan admin.
    Untuk customer hanya bisa masuk ke tampilan toko onlinenya, lalu untuk employee dan admin bisa masuk ke dashboard admin.Lebih baik pakai roles permission seperti ini atau pakai multi auth ya?
    Terima kasih Mas.

  2. melvira

    Salam hormat mas,
    aku pake laravel 7, –>
    typeError
    Argument 1 passed to Illuminate\Auth\EloquentUserProvider::validateCredentials() must be an instance of Illuminate\Contracts\Auth\Authenticatable, instance of App\Admin given

    trim’s sebelumnya

      1. redho

        mas apakah dalam kelas kursus punya mas yang seperti ini diajarkan? saya butuh materi bantuan untuk membuat blog mas, jadi mau misahin hak akses admin, pengunjung sama writernya. mohon dijawab mas 🙂

  3. muhammad rivaldin

    bang aku udah berhasil login untuk user dan admin udah sesuai tapi aku coba buat user baru bukan buat di seedernya tapi langsung registrasi dan itu bisa masuk tapi setelah logout aku coba lagin dg user baru tadi tiba2 gk bisa dan ada keterangan seperti ini bang :

    403User does not have the right roles.

    mohon pencerahanya bang masih pemula hehehe..

  4. Candra Kartika

    Kenapa saya saat melakukan
    Seeding: RoleSeeder

    malah menemui error

    Spatie\Permission\Exceptions\RoleAlreadyExists

    A role `admin` already exists for guard `web`.

    Solusinya gimana ya?

  5. avinda

    Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in phar://C:/ProgramData/ComposerSetup/bin/composer.phar/src/Composer/DependencyResolver/RuleWatchGraph.php on line 52
    kak saya pas install composer permissions error seperti itu kenapa yaa?

  6. zoro

    permisi mas, kenapa ya pas saya jalan kan projectnya berhasil login dengan menggunakan user dan admin, tapi kok pas baru login terus saya pencet tombol back kok malah ke tampilan home admin ya ? mohon pencerahannya mas

  7. zoro

    permisi mas, kenapa ya pas saya jalan kan projectnya berhasil login dengan menggunakan user dan admin, tapi kok pas baru login terus saya pencet tombol back kok malah ke tampilan home tampilan default laravel nya ya ? mohon pencerahannya mas

  8. fauzi

    halo mas izin tanya. kalau di routenya ini ingin bisa diakses oleh 2 role gimana ya penulisannya? misal ingin page user bisa diakses oleh user dan admin. saya sudah cobaubah di route nya dengan menambah role tapi masih eror. terima kasih

Tinggalkan Balasan