Lumen Service App - Authorization
Pada artikel kali ini kita akan melanjutkan membuat web service menggunakan PHP menggunakan framework Lumen dari Laravel. pada kal ini kita akan menambahkan fungsi autoritas. agar membuat sekuritas terhadap data yang kita punya dan otorisasi yang bisa mengakses data kita.
Menambahkan Column Role Pada Table users
Perhatian ! : Jika sebelumnya belum membuat table users, kita harus membuat dulu table users. tutorialnya ada pada link terlampir : Lumen Service App - Validation dan Error Handling
Untuk menambahkan column role pada table users, mari kita ikuti langkah-langkah berikut ini:
1. Membuat database migration dengan menjalankan command dibawah ini pada terminal: "php artisan make:migration add_role_to_users_table --table=users"
2. Buka file database/migrations/..._add_role_to_users_table.php, dan ubah menjadi seperti gambar dibawah ini
3. setelah itu kita bisa melihat pada database kita bahwa terdapat kolom baru bernama role dengan isian berupa salah satu dari reader, editor, atau admin dengan isian nilai default berupa reader
4. lalu kita coba membuat beberapa user dengan menggunakan postman dengan role yang berbeda beda setiap usernya
Kita akan tentukan masing masing role mempunyai fitur sebagai berikut
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:
1. Buka file app/Providers/AuthServiceProvider.php, codenya seperti dibawah ini.
lalu tambahkan sintaks untuk mendifiniskan post sesuai dengan role yang telah ditentukanlalu setelah itu kita coba untuk menggunakan login admin, dan saya akan merubah post ini jadi untuk user 4 (editor)
<?phpnamespace App\Http\Controllers\Publik;use App\Http\Controllers\Controller;use App\Models\Post;use Illuminate\Http\Request;use Illuminate\Support\Facades\Auth;use Illuminate\Support\Facades\Gate;class PostController extends Controller{public function index(Request $request){$acceptHeader = $request->header('Accept');if($acceptHeader === "application/json" || $acceptHeader === "application/xml" ){if (Gate::denies('reader')) {return response()->json(['success' => false,'status' => 403,'message' => 'You are unauthorized'], 403);}$posts = Post::orderBy('id','Desc')->paginate(5)->toArray();if($acceptHeader === "application/json"){$response = ["total_count" => $posts["total"],"limit" => $posts["per_page"],"pagination" => ["next_page" => $posts["next_page_url"],"current_page" => $posts["current_page"],],"data" => $posts['data']];return response()->json($response, 200);}else{$xml = new \SimpleXMLElement('<posts/>');foreach ($posts->items('data') as $item) {$xmlItem = $xml->addChild('post');$xmlItem->addChild('id', $item->id);$xmlItem->addChild('title', $item->title);$xmlItem->addChild('status', $item->status);$xmlItem->addChild('content', $item->content);$xmlItem->addChild('user_id', $item->user_id);$xmlItem->addChild('created_at', $item->created_at);$xmlItem->addChild('updated_at', $item->updated_at);}return $xml->asXML();}}else{return response('Not Acceptable!', 406);}}public function show(Request $request, $id){$acceptHeader = $request->header('Accept');if($acceptHeader === "application/json" || $acceptHeader === "application/xml" ){if (Gate::denies('reader')) {return response()->json(['success' => false,'status' => 403,'message' => 'You are unauthorized'], 403);}$post = Post::find($id);if(!$post){abort(404);}if($acceptHeader === "application/json"){return response()->json($post,200);}else{$xml = new \SimpleXMLElement('<posts/>');$xmlItem = $xml->addChild('post');$xmlItem->addChild('id', $post->id);$xmlItem->addChild('title', $post->title);$xmlItem->addChild('status', $post->status);$xmlItem->addChild('content', $post->content);$xmlItem->addChild('user_id', $post->user_id);$xmlItem->addChild('created_at', $post->created_at);$xmlItem->addChild('updated_at', $post->updated_at);return $xml->asXML();}}else{return response('Not Acceptable!', 406);}}}