Halo sobat Newbie, pada kesempatan kali ini kita akan membahas PHP Lumen Authorization. Tutorial ini melanjutkan tutorial sebelumnya yaitu PHP Lumen Authentication Tentu dalam menerapkan authorization ini kita gunakan, project lumen sebelumnya yang telah terdapat tabel users yang nanti akan kita buat authorizationnya

Pertama Kita Menambahkan Column "Role" Pada Table users.
Untuk menambahkan column role pada table users, mari kita ikuti langkah-langkah berikut ini:
Membuat database migration dengan menjalankan command dibawah ini pada terminal
php artisan make:migration add_role_to_users_table --table=users
Apabila berhasil maka akan tampil seperti ini

Buka file database/migrations/..._add_role_to_users_table.php, dan ubah menjadi seperti dibawah ini

Jalankan command dibawah ini pada terminal
php artisan migrate

Secara default column role yang sudah terdaftar di database menjadi role=reader.
Kita akan memerlukan 3 users dengan role yang berbeda, silahkan bikin user dengan role:
1. admin
2. editor
3. reader
Kita harus menambahkan syntax field role pada app/Http/Controllers/AuthController.php terlebih dahulu. Lihat line 37

Maka hasilnya akan seperti di bawah ini

Lihat id 13, role pada database menjadi editor (tidak default)


Kebutuhan User Role
Setiap role dari user, memiliki kemampuan yang berbeda-beda, yakni:
1. Admin
    - Bisa read all posts
    - Bisa read detail posts
    - Bisa create posts
    - Bisa update posts
    - Bisa delete posts

2. Editor
    - Bisa read all posts (yang dibuat oleh user yang lagi login)
    - Bisa read detail post (yang dibuat oleh user yang lagi login)
    - Bisa create posts
    - Bisa update post (yang dibuat oleh user yang lagi login)
    - Bisa delete post (yang dibuat oleh user yang lagi login)

3. Reader
    - Bisa read all posts
    - Bisa read detail posts
    - Bisa memberikan comment pada post tertentu

Membuat Logika Policy Pada Read All Post
Logika policy ini berguna untuk menentukan role apa bisa mengakses data apa. Untuk implementasi kebutuhan user role diatas, kita akan menggunakan fitur policies dari Lumen. Untuk membuat logika policy pada read all, mari ikuti langkah-langkah dibawah ini:
1. Buka file app/Providers/AuthServiceProvider.php, codenya seperti dibawah ini. Lihat line 33-35

2. Buka file app/Http/Controllers/PostsController.php, tambahkan Gate class dan ubah function index

3. Anda coba login dengan user yang role = ‘user’, maka respon nya seperti dibawah ini.

4. Anda coba login dengan user yang role = ‘admin’ atau ‘editor’, maka respon nya seperti dibawah ini

5. Kalau login pakai ‘admin’, maka list post nya adalah semua posts, kalau login pakai ‘editor’ pakai list post nya hanya post yang user_id = user logged in id.

Membuat Logika Policy Pada Update Post
User yang bisa melakukan update adalah ‘editor’ dan ‘admin’. Untuk ‘editor’ hanya bisa meng-update post yang dia create, untuk ‘admin’ bisa meng-update semua post. Untuk membuat logika policy pada create, mari ikuti langkah-langkah dibawah ini:

1. Buka file app/Providers/AuthServiceProvider.php, codenya seperti dibawah ini. Lihat line 43 - 51

2. Buka file app/Http/Controllers/PostsController.php, ubah function update. Lihat line 140 - 158


3. Anda coba login dengan user yang role = ‘reader’, maka respon nya seperti dibawah ini.

4. Kalau anda login dengan user yang valid authorization nya, maka tampilanya seperti dibawah ini

Endpoint Untuk Public User
Untuk public user bisa melakukan Read All dan Read Detail. Untuk mengakomodir kebutuhan ini kita akan membuat routes dan controller baru.
GET/public/posts 
File Controller: app/Http/Controllers/Public/PostsController.php 
Function: index

GET/public/post/{postID} 
 File Controller: app/Http/Controllers/Public/PostsController.php 
 Function: Show


Kemudian buat subfolder dari Controller bernama Publics, buat controller PostsController

Buat function index pada PostsController.php

pada function index di atas kita memanggil logika policy baru untuk user ‘reader’. Kemudian kita tambahkan pada AuthServiceProvider.php script berikut.

Sekarang test di postman mengunakan user role ‘reader’ dan endpoint http://localhost:8000/public/post maka response akan seperti berikut.

Selanjutnya terapkan pada method show detail post, buat function show pada App\Http\Controllers\Publics\PostController.php

Buat logika policy baru di AuthServiceProvider.php

Kemudian test di postman untuk melihat detail data post berdasarkan id

Untuk user dengan role ‘reader’ hanya bisa mengakses read all data post, dan detail post melalui endpoint /public/posts dan /public/posts/{id}. Selanjutnya kita akan menerapkan function store, show, delete pada user ‘admin’ dan ‘editor’

Membuat Logika Policy Pada Show, Save, dan Delete Post Dengan Role ‘Admin’ & ‘Editor’
Pertama kita buat terlebih dahulu logika policy pada folder app\Providers\AuthServiceProviders.php


Setelah itu kita terapkan pada method store terlebih dahulu, tambahkan script berikut.

Selanjutnya kita test si postman dengan melakukan inputan data melalui body->form data

Mengapa responnya seperti itu ? karena kita melakukan input data post menggunakan user role ‘reader’, sekarang kita coba login menggunakan user role ‘admin’, maka respon akan seperti dibawah ini.

Selanjutnya kita modifikasi method show

Test endpoint untuk mengakses detail data post menggunakan postman, saat ini kita sedang login menggunakan user role ‘admin’, maka kita bisa mengkases detail post dengan id berapapun

Selanjutnya menerapkan pada method destroy, lakukan modifikasi pada method destroy seperti berikut

Saat ini kita sedang login menggunakan user role ‘admin’, maka kita bisa menghapus data dengan id berapapun seperti berikut.

Namun ketika kita login menggunakan user role ‘editor’, kita hanya bisa menghapus data berdasarkan user_id yang sedang login.
Sekian tutorial kali ini, selamat mencoba.