Tutorial Inertia Roles & Permissions - #4 - Installasi Laravel Spatie

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan melakukan installasi laravel spatie untuk menghandle roles & permissions.

Rafi Taufiqurrahman
Dipublish 11/07/2024

Pendahuluan

Pada project kali ini kita akan menggunakan sebuah package yang sangat powerfull yang bernama laravel permission dari spatie, laravel spatie nantinya akan kita gunakan untuk mengatur roles dan permissions didalam project kita.

Installasi Laravel Permission Spatie

Silahkan teman-teman buka terminal-nya, kemudian jalankan perintah berikut ini :

Terminal
composer require spatie/laravel-permission:6.4.0

Silahkan tunggu proses installasi-nya sampai selesai. Dan pastikan teman-teman terhubung dengan internet, karena paket ini akan diinstall secara online.

Publish Konfigurasi Laravel Permission

Setelah proses installasi selesai dilakukan, sekarang kita lanjutkan untuk melakukan proses publish konfigurasi dari Laravel Spatie Permission. Silahkan jalankan perintah berikut ini di dalam terminal/CMD :

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

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan 2 file baru, yaitu :

  1. config/permissions.php
  2. database/migrations/2024_04_22_085406_create_permission_tables.php

Jika kita lihat, di dalam file migration Laravel Spatie Permission akan membuat 5 table, yaitu :

  1. roles
  2. permissions
  3. role_has_permissions
  4. model_has_roles
  5. model_has_permissions

Konfigurasi Model User

Kita lanjutkan untuk menambahkan Traits HasRoles milik Laravel Spatie Permission di dalam Model User. Ini digunakan agar kita bisa menggunakan fitur dan relasi yang ada di dalam Laravel Spatie Permission melalui Model User.

Silahkan buka file app/Models/User.php, kemudian ubah kode-nya menjadi seperti berikut ini :

User.php
<?php

namespace App\Models;

// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasFactory, Notifiable, HasRoles;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * Get the attributes that should be cast.
     *
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
        ];
    }

    /**
     * getUserPermissions
     *
     * @return void
     */
    public function getUserPermissions()
    {
        return $this->getAllPermissions()->mapWithKeys(fn($permission) => [$permission['name'] => true]);
    }

    /**
     * isSuperAdmin
     *
     * @return void
     */
    public function isSuperAdmin()
    {
        return $this->hasRole('super-admin');
    }
}

Di atas kita import Traits dari Laravel Spatie, kurang lebih seperti berikut ini :

User.php
use Spatie\Permission\Traits\HasRoles;

kemudian kita gunakan Traits tersebut di dalam Model Class User, kurang lebih seperti berikut ini :

user.php
use HasFactory, Notifiable, HasScope, HasRoles;

Selanjutnya kita juga menambahkan sebuah method baru dengan nama getUserPermissions, method tersebut kita gunakan untuk mendapatkan data permissions yang dimiliki oleh user.

User.php
public function getUserPermissions()
{
    return $this->getAllPermissions()->mapWithKeys(fn($permission) => [$permission['name'] => true]);
}

Terakhir kita juga membuat sebuah method baru dengan nama isSuperAdmin, method tersebut kita gunakan untuk melakukan pengecekan apakah user memiliki role super-admin.

public function isSuperAdmin()
{
    return $this->hasRole('super-admin');
}

Register Middleware

Agar Laravel Sptie Permission dapat digunakan di dalam aplikasi, maka kita perlu melakukan register middleware. SIlahkan buka file bootstrap/app.php, kemudian tambahkan kode berikut ini di dalam withMiddleware.

app.php
$middleware->alias([
    'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
    'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
    'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,
]);

Jika ditulis secara lengkap, kurang lebih seperti berkut ini :

app.php
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        $middleware->web(append: [
            \App\Http\Middleware\HandleInertiaRequests::class,
            \Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets::class,
        ]);

        $middleware->alias([
            'role' => \Spatie\Permission\Middleware\RoleMiddleware::class,
            'permission' => \Spatie\Permission\Middleware\PermissionMiddleware::class,
            'role_or_permission' => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();

Super Admin

Terakhir kita akan mendefinisikan sebuah role yang bisa mengakses semua aplikasi yang kita punya, silahkan teman - teman buka file yang bernama AppServiceProvider.php yang terletak di app/Providers, kemudian tambahkan kode berikut ini.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        //
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        // This works in the app by using gate-related functions like auth()->user->can() and @can()
        Gate::before(function ($user, $ability) {
            return $user->hasRole('super-admin') ? true : null;
        });
    }
}

Series Artikel

Berikut ini daftar series artikel dari Tutorial Laravel Inertia Roles & Permissions

1
Tutorial Inertia Roles & Permissions - #1 - Project Overview

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan bahasa teknologi apa saja yang kita gunakan dan scope dari project yang akan kita bangun.

2
Tutorial Inertia Roles & Permissions - #2 - Installasi Project

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan mulai melakukan installasi project laravel kita dari awal menggunakan composer.

3
Tutorial Inertia Roles & Permissions - #3 - Installasi Laravel Breeze & Inertia

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan melakukan installasi laravel breeze dan inertia sebagai starter-kit kita.

4
Tutorial Inertia Roles & Permissions - #4 - Installasi Laravel Spatie

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan melakukan installasi laravel spatie untuk menghandle roles & permissions.

5
Tutorial Inertia Roles & Permissions - #5 - Membuat Model, Migration, Faker Dan Seeder Laravel

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan membuat sebuah model, migration, faker dan seeder yang akan kita gunakan di dalam project kita.

6
Tutorial Inertia Roles & Permissions - #6 - Membuat Relasi Antar Tabel Menggunakan Laravel Eloquent Relationship

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan membuat relasi antar tabel menggunakan laravel eloquent relationship.

7
Tutorial Inertia Roles & Permissions - #7 - Membuat Share Data Global Inertia

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan belajar membuat sebuah data yang dapat diakses di semua halaman menggunakan inertia.

8
Tutorial Inertia Roles & Permissions - #8 - Membuat Reusable Component Dengan React

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan belajar membuat sebuah reusable component menggunakan react.

9
Tutorial Inertia Roles & Permissions - #9 - Membuat Utils Permissions Dengan Inertia React

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan belajar membuat sebuah utils untuk menghandle permissions yang kita miliki.

10
Tutorial Inertia Roles & Permissions - #10 - Membuat Module Dashboard Dengan Inertia React

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan membuat sebuah module dashboard dengan inertia react.

11
Tutorial Inertia Roles & Permissions - #11 - Membuat Module Post Dengan Inertia React

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan membuat sebuah module post dengan inertia react.

12
Tutorial Inertia Roles & Permissions - #12 - Membuat Module Permission Dengan Inertia React

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan membuat sebuah module permission dengan inertia react.

13
Tutorial Inertia Roles & Permissions - #13 - Membuat Module Role Dengan Inertia React

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan membuat sebuah module role dengan inertia react.

14
Tutorial Inertia Roles & Permissions - #14 - Membuat Module User Dengan Inertia React

Artikel ini merupakan series dari Tutorial Laravel Inertia Roles & Permissions, disini kita akan membuat sebuah module user dengan inertia react.

JurnalKoding

Mulai asah skill dengan berbagai macam teknologi - teknologi terbaru seperti Laravel, React, Vue, Inertia, Tailwind CSS, dan masih banyak lagi.

© 2024 JurnalKoding, Inc. All rights reserved.