PHP LUMEN AUTHORIZATION
PHP LUMEN AUTHORIZATION
Hai, ditutorial hari ini akan saya jelaskan cara menerapkan authorization.
Pertama kita tambahkan terlebih dahulu column role pada table users denga membuat migrasi baru seperti berikut.
Kita membuat tipe data enum untuk role yag terdiri dari 3 data yaitu reader, editor, dan admin. Secara default column role yang sudah terdaftar di database menjadi role=reader.
Sekarang kita atur kebutuhan user role.
Admin
- Bisa read all posts
- Bisa read detail post
- Bisa create post
- Bisa update post
- Bisa delete post
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)
Reader
- Bisa read all posts
- Bisa read detail post
- Bisa memberikan comment pada post tertentu
Membuat Logika Policy Pada Read All Post
Logika police 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 :
Buka file app/Providers/AuthServiceProvider.php, ubah code nya seperti dibawah ini.
Buka file app/Http/Controllers/PostsController.php, tambahkan Gate class dan ubah function index seperti berikut.
Sekarang coba login dengan user yang role = ‘reader’, kemudian akses endpoint http://localhost:8000/posts?page=1 maka respon nya seperti dibawah ini.
Sekarang coba login dengan user yang role = ‘admin’ atau ‘editor’, jika kita login menggunakan role ‘admin’, maka list post nya adalah semua posts.
Sedangkan jika kita login menggunakan role ‘editor’, maka respon nya hanyalah data post yang memiliki user_id seperti id user login.
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 :
Buka file app/Providers/AuthServiceProvider.php, modifikasi script menjadi seperti berikut.
Buka file app/Http/Controllers/PostsController.php, ubah function update menjadi seperti berikut.
Anda coba login dengan user yang role = ‘reader’, lakukan update data, maka respon nya seperti dibawah ini.
Jika anda login dengan user yang valid authorization nya, maka tampilanya seperti dibawah.
Endpoint Untuk Public User
Untuk public user atau role ‘reader’ bisa melakukan Read All dan Read Detail. Untuk mengakomodir kebutuhan ini kita akan membuat routes dan controller baru.
GET /public/posts -> endpoint untuk read all.
GET /public/posts/{id} -> endpoint untuk read detail.
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/posts maka response akan seperti berikut.
Selanjutnya terapkan pada method show detail post, buat function show pada App\Http\Controllers\Publics\PostsController.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
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.
Namun ketika kita login menggunakan user role ‘editor’, kita hanya bisa mengkases detail post dengan id berdasarkan user_id yang login, sebagai contoh kita mengakses detail post dengan id 19 tetap bisa karena user id tersebut adalah 3 atau sama dengan id user yang sedang login.
Namun ketika kita ingin mengakses detail post dengan id 9, respon akan ‘You are unauthorized’ karena id post 9 memiliki user_id = 1.
Untuk lebih memastikannya sekarang login kembali menggunakan role ‘admin’, maka data post dengan id 9 akan bisa di akses karena role ‘admin’ bisa mengkases seluruh data detail post.
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.
Mengapa demikian ? karena post dengan id 16 memiliki user_id = 1, sedangkan user yang sedang login memiliki id = 3, maka dari itu kita coba untuk menghapus data post dengan id 18, dimana data post tersebut memiliki user_id = 3.
Sekian tutorial kali ini, selamat mencoba.
Comments
Post a Comment