Mengelola Izin dan Peran dengan Laravel Permission


Mengelola izin dan peran dalam aplikasi yang dibuat merupakan salah satu aspek penting yang harus diperhatikan. Banyak sekali contoh aplikasi web yang memiliki banyak user dimana setiap user memiliki izin (permission) dan peran (role) yang berbeda beda. User yang tidak memiliki permission dan role yang sesuai seharusnya tidak bisa dan tidak boleh mengakses fitur tertentu pada aplikasi web. Pada laravel terdapat salah satu package yang bisa dimanfaatkan dalam mengelola permission dan role pada setiap user yaitu laravel-permission.

Sebagaimana tertulis pada website dokumentasi Laravel Permission yaitu “Associate users with permissions and roles”, package ini adalah paket yang kuat dan fleksibel untuk mengelola izin dan peran dalam aplikasi Laravel. Paket ini memudahkan developer untuk menambahkan otorisasi berbasis peran ke aplikasi Laravel.

Instalasi dan Konfigurasi Laravel Permission

  1. Install laravel-permission via composer:

composer require spatie/laravel-permission

  1. Service provider dari laravel-permission akan otomatis terdaftar di config/app.php atau jika service provider belum terdaftar daftarkan secara manual

‘providers’ => [

    // …

    Spatie\Permission\PermissionServiceProvider::class,

];

  1. Publish file migrasi dan config yang didapat dari package laravel-permission dengan menjalankan perintah:

php artisan vendor:publish –provider=”Spatie\Permission\PermissionServiceProvider”

  1. Jalankan migrasi

php artisan migrate 

  1. Tambahkan traits ‘HasRoles’ pada model User

use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable

{

    use HasRoles;

    //…

}

Setelah proses instalasi dan konfigurasi selesai, selanjutnya aplikasi laravel kini bisa lebih mudah untuk mengelola izin dan role dari setiap user. 

Penggunaan Sederhana Laravel Permission

Contoh kasus yang bisa digunakan adalah sebuah aplikasi website yang memiliki user dimana setiap user memiliki rolenya masing masing. Misalkan saja terdapat aplikasi web pengelolaan artikel dimana pada web tersebut memiliki user dengan role admin dan user dengan role author. Admin hanya bisa melihat list artikel yang dibuat oleh author dan menghapus artikel jika terdapat konten negatif pada artikel yang dibuat. Admin tidak bisa menambahkan artikel baru sedangkan author bisa. Contoh studi kasus ini bisa ditangani dengan mudah menggunakan laravel-permission.

Pertama-tama untuk memulai dari awal, aplikasi laravel terlebih dahulu membutuhkan login untuk membedakan user dengan role apa yang sedang login. Agar lebih mudah fitur login bisa dibuat dengan bantuan laravel breeze. berikut link artikelnya tentang penggunaan laravel breeze.

Setelah semua package terinstall baik laravel breeze dan laravel permission, selanjutnya membuat role dan membuat user sebagai admin di database seeder.

Pada database seeder diatas pertama tama membuat role admin dan author, selanjutnya membuat user baru dan memberikan dia role sebagai admin. Jangan lupa gunakan use Spatie\Permission\Models\Role untuk mengimport method yang disediakan oleh laravel permission. Gunakan php artisan db:seed atau php artisan migrate:fresh –seed untuk menjalankan database seeder.

misalnya disini setelah login terdapat halaman daftar artikel yang dimiliki oleh setiap author. Admin hanya diperbolehkan untuk melihat detail dan menghapus artikel jika mengandung hal negatif. Admin tidak diperbolehkan untuk membuat artikel baru dan mengedit artikel yang telah dibuat oleh author. Jika menggunakan laravel permission, menghilangkan tombol tambah dan edit dapat menggunakan directive blade @role(‘’) @endrole. Contohnya sebagai berikut

@role(‘author’)

<a href=“{{url(‘/article/create’)}}” class=“bg-teal-500 flex items-center text-white rounded hover:bg-teal-600 p-1.5”><i class=“fa fa-plus text-white mr-2”></i> Tambah Artikel</a>

 @endrole

@role(‘author’)

<form action=“{{url(‘/article/edit’,$item->id)}}” method=“POST” class=“inline”>

   @csrf

<button type=“submit” class=“bg-indigo-500 h-10 w-10 rounded hover:bg-indigo-600”><i    class=“fa fa-pencil text-white”></i></button>

</form>

@endrole

Pada code di atas hanya akan menampilkan tombol tambah dan edit ketika user yang login memiliki role author saja. Sehingga tampilan pada admin sebagai berikut:

Pada tahap ini pengelolaan role berdasarkan user sudah cukup baik. Namun masih ada celah yang bisa dimanfaatkan yaitu admin masih bisa mengakses halaman create melalui url dengan mengetikkan route create artikelnya. 

Hal ini seharusnya tidak diperbolehkan karena lagi lagi admin tidak memiliki akses untuk membuat artikel baru. Hal ini bisa terjadi karena penanganan akses hanya sebatas pada tampilan saja bukan dari route nya. Untuk menangani masalah ini diperlukan middleware yang bisa membatasi route mana saja yang boleh diakses oleh user dengan role tertentu.

Role sebagai middleware

Pada saat ini pada web.php semua route yang berkaitan dengan proses CRUD artikel masih dijaga oleh middleware auth. Artinya selama user telah login, semua route bisa diakses. Berikut tampilan pada web.php

Pada laravel permission role yang sudah dibuat dapat dijadikan middleware sehingga route bisa dibatasi hanya boleh diakses oleh user dengan role tertentu.

Berikut langkah langkahnya:

  1. Daftarkan middleware milik laravel permission di app > Http > Kernel.php

protected $middlewareAliases = [

    // …

    ‘role’ => \Spatie\Permission\Middleware\RoleMiddleware::class,

    ‘permission’ => \Spatie\Permission\Middleware\PermissionMiddleware::class,

    ‘role_or_permission’ => \Spatie\Permission\Middleware\RoleOrPermissionMiddleware::class,

];

Laravel 9 menggunakan $routeMiddleware sedangkan Laravel 10+ menggunakan $middlewareAliases 

  1. Selanjutnya pada web.php buat grup route dengan menambahkan middleware ‘role:<name>’.

Isi web.php kini menjadi:

Route group pertama berisi route yang bisa diakses oleh user yang telah login tanpa memandang rolenya. Route kedua dan ketiga berisi route yang hanya dapat diakses oleh user yang memiliki role tertentu. Pada code diatas route untuk melihat daftar artikel, melihat detail artikel, dan menghapus detail artikel berada pada group yang memiliki middleware auth saja. Artinya route yang berada di group tersebut bisa diakses oleh admin maupun author. Sedangkan pada route group kedua adalah route yang hanya bisa diakses admin saja (saat ini belum ada route yang hanya bisa diakses khusus untuk admin). Route group ketiga berisi route yang hanya bisa diakses oleh author saja yaitu create artikel dan edit artikel.

Ketika admin login dan berusaha mengakses halaman create artikel melalui url maka hal tampilannya akan menjadi sebagai berikut:

Memberikan role author pada semua user yang akan mendaftar

Pada kasus selanjutnya adalah semua user yang akan mendaftar akan diberikan role sebagai author. Dikarenakan project ini menggunakan laravel breeze maka fitur registrasi sudah ada dan siap untuk digunakan. Penyesuaian yang diperlukan adalah ketika ada user yang mendaftar maka otomatis role user tersebut adalah author.

Di laravel breeze controller untuk mengatur user yang akan register berada di RegisteredUserController.php. Ketika user berhasil teregistrasi tambahkan code untuk memberikan role author pada user baru.

code $user->assignRole(‘author’) ditambahkan agar setiap kali user baru akan otomatis mendapatkan role author.

Ketika login tampilan author sebagai berikut:

Author dapat menambahkan artikel baru, melihat, mengubah, dan menghapus artikel milik dia sendiri. 

Laravel Permission memiliki banyak fitur yang memudahkan developer untuk mengolah role setiap user agar user tidak bisa mengakses fitur yang memang bukan hak mereka. Dengan menggunakan package ini, aplikasi laravel yang dibuat bisa lebih aman karena hak akses setiap pengguna bisa dijaga lebih baik daripada sebelumnya. Dokumentasi package ini juga sangat lengkap yang dapat diakses di website officialnya.

Sumber:

https://spatie.be/docs/laravel-permission/v6/introduction
https://docs.digitalamoeba.id/technology/engineering/solusi-autentikasi-yang-simple-dan-efisien-menggunakan-laravel-breeze/

Ditulis oleh Backend Developer Intern at Digital Amoeba MSIB Batch 6
Afif Rohul Abrori – Universitas Jember (linkedin.com/in/afifrohul)