Mapping User, Role & Permission


Tutup Daftar pelajaran ( / 46)

Di chapter ini, kita akan membuat fitur authentikasi menggunakan package laravel breeze yang sudah diinstall di chapter sebelumnya. Selain itu kita juga akan melakukan mapping antara User, Role dan Permission untuk menentukan hak akses pada sistem bagi masing-masing role.

Kita buat file seeder dengan menggunakan perintah berikut.

Terminal
php artisan make:seeder UserRolePermissionSeeder

Perintah tersebut akan membuat file seeder di folder database/seeders. Buka file tersebut dan sesuaikan seperti dibawah ini.

database/seeders/UserRolePermissionSeeder.php
<?php

namespace Database\Seeders;

use App\Models\User;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class UserRolePermissionSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // create role
        $karyawan = Role::create(['name' => 'karyawan']);
        $staff_finance = Role::create(['name' => 'staff_finance']);
        $manager_finance = Role::create(['name' => 'manager_finance']);

        // create permission
        $read_supplier = Permission::create(['name' => 'read supplier']);
        $create_supplier = Permission::create(['name' => 'create supplier']);
        $update_supplier = Permission::create(['name' => 'update supplier']);
        $delete_supplier = Permission::create(['name' => 'delete supplier']);

        $read_pengajuan = Permission::create(['name' => 'read pengajuan-pembelian-barang']);
        $create_pengajuan = Permission::create(['name' => 'create pengajuan-pembelian-barang']);
        $update_pengajuan = Permission::create(['name' => 'update pengajuan-pembelian-barang']);
        $delete_pengajuan = Permission::create(['name' => 'delete pengajuan-pembelian-barang']);

        $read_perbandingan = Permission::create(['name' => 'read perbandingan-harga']);
        $create_perbandingan = Permission::create(['name' => 'create perbandingan-harga']);
        $update_perbandingan = Permission::create(['name' => 'update perbandingan-harga']);
        $delete_perbandingan = Permission::create(['name' => 'delete perbandingan-harga']);

        $read_pemesanan = Permission::create(['name' => 'read pemesanan-barang']);
        $create_pemesanan = Permission::create(['name' => 'create pemesanan-barang']);
        $update_pemesanan = Permission::create(['name' => 'update pemesanan-barang']);
        $delete_pemesanan = Permission::create(['name' => 'delete pemesanan-barang']);

        $read_penerimaan = Permission::create(['name' => 'read penerimaan-barang']);
        $create_penerimaan = Permission::create(['name' => 'create penerimaan-barang']);
        $update_penerimaan = Permission::create(['name' => 'update penerimaan-barang']);
        $delete_penerimaan = Permission::create(['name' => 'delete penerimaan-barang']);

        // attach permission
        $karyawan->givePermissionTo([
            $read_pengajuan,
            $create_pengajuan,
            $update_pengajuan,
            $delete_pengajuan,
            $read_penerimaan
        ]);
        $staff_finance->givePermissionTo([
            $read_supplier,
            $create_supplier,
            $update_supplier,
            $delete_supplier,
            $read_pengajuan,
            $read_perbandingan,
            $create_perbandingan,
            $update_perbandingan,
            $delete_perbandingan,
            $read_pemesanan,
            $read_penerimaan,
            $create_penerimaan,
            $update_penerimaan,
            $delete_penerimaan
        ]);
        $manager_finance->givePermissionTo([
            $read_supplier,
            $read_pengajuan,
            $read_perbandingan,
            $read_pemesanan,
            $create_pemesanan,
            $update_pemesanan,
            $delete_pemesanan,
            $read_penerimaan
        ]);

        // create user & assign role
        User::factory()->create([
            'name' => 'Karyawan',
            'email' => '[email protected]',
            'password' => bcrypt('password')
        ])->assignRole('karyawan');

        User::factory()->create([
            'name' => 'Staff Finance',
            'email' => '[email protected]',
            'password' => bcrypt('password')
        ])->assignRole('staff_finance');

        User::factory()->create([
            'name' => 'Manager Finance',
            'email' => '[email protected]',
            'password' => bcrypt('password')
        ])->assignRole('manager_finance');
    }
}

Kemudian buka file DatabaseSeeder.php di folder database/seeders dan sesuaikan seperti dibawah ini.

database/seeders/DatabaseSeeder.php
<?php

namespace Database\Seeders;

use App\Models\User;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     */
    public function run(): void
    {
        // User::factory(10)->create();

        User::factory()->create([
            'name' => 'Test User',
            'email' => '[email protected]',
        ]);

        $this->call([
            UserRolePermissionSeeder::class
        ]);
    }
}

Seeder yang kita buat, digunakan untuk membuat role, permission dan memasangkannya dengan user yang kita buat.

Setelah itu, jalankan perintah seeder berikut:

Terminal
php artisan db:seed

Sekedar informasi tambahan, untuk menjalankan perintah migrasi dan seeder, ada beberapa pilihan perintah yang biasa digunakan. Perintah diatas akan menjalankan perintah seeder untuk semua file seeder yang ada pada method $this->call([]).

Jika kita hanya ingin menjalankan perintah seeder hanya untuk satu file seeder gunakan perintah berikut.

Terminal
php artisan db:seed --class=NamaFileSeeder

Jika kita ingin menjalankan file migrasi yang baru sekaligus menjalankan seeder gunakan perintah berikut.

Terminal
php artisan migrate --seed

Jika kita ingin menjalankan ulang seluruh file migrasi sekaligus menjalankan seeder gunakan perintah berikut. Namun perlu diperhatikan perintah ini akan menghapus semua table yang ada di database dan membuat ulang table-table tersebut sehingga semua data akan terhapus, jadi kita harus hati-hati menggunakannya.

Terminal
php artisan migrate:fresh --seed