Tanggal :2 Juni 2023
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. diday Reply

    apa ga ada cara yg lebih efektif klo sperti itu cape juga jika harus define per role di setiap kondisi , klo role ada 10 akan banyak kodingan

  2. Praditya Nafiis Muhammad Reply

    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.

  3. melvira Reply

    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

  4. Hilmi Hidayat Reply

    berarti kalau diimplementasikan di form register, musti ditambahkan form baru yg nantinya akan diinputkan ke tabal model_has_roles ya mas ?

      1. redho Reply

        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 🙂

  5. ilham Reply

    model_has_permissions
    permissions
    role_has_permissions
    itu semua table di database buat apa ya mas?

  6. muhammad rivaldin Reply

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

    1. Muhammad Amirul Ihsan Post author Reply

      oh iya belum ada di tulisannya ya, untuk register setelah create user tambahkan untuk assign role mirip di Seeder.

      Misalnya :
      $user->assignRole(‘user’);

      taruh baris kode tersebut setelah user dibuat.

  7. Rafli Aryansyah Reply

    Halo mas amirul, saya mau ngeimplementasiin spati ini di project saya yang akan datang karena saya membuat laravel sebagai api, dan apakah ini cocok ya? oh iya mas kalau buat manualnya sendiri apakah sudah ada tutorialnya di kawankoding ya? Terima kasih

  8. Candra Kartika Reply

    Kenapa saya saat melakukan
    Seeding: RoleSeeder

    malah menemui error

    Spatie\Permission\Exceptions\RoleAlreadyExists

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

    Solusinya gimana ya?

  9. avinda Reply

    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?

  10. Trio Hardiyanto Reply

    saya mau buat rolenya, admin dinas daftarkan user admin sekolah, kemudian user admin sekolah mendaftarkan user guru, yang perlu ditambahkan apanya pak

  11. Terra Purnama Putra Reply

    Kan itu datanya ambil dari UserSeeder, kalo mau ambil dari database yg sudah kita buat gimana mas Amirul? Maaf lagi bingung soalnya hehe

  12. zoro Reply

    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

  13. zoro Reply

    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

  14. fauzi Reply

    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

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *