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 ditentukan


Jika kita mencoba pada postman dengan menggunakan login dari reader maka akan menampilkan error seperti gambar di bawah


Tapi kalau kita menggunakan login dari reader atau editor maka akan muncul seperti gambar dibawah

Login Editor 

Mengapa tidak ada post, karena untuk editor ini belum pernah membuat post apapun
Lalu kita coba menggunakan login admin


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 kembali file app/Providers/AuthServiceProvider.php, codenya seperti dibawah ini.



lalu buka controller PostController lalu pada fungsi update tambahkan sintaks seperti gambar dibawah


dan kita akan mencobanya pada postman kita akan merubah post dengan id "41" dan juga login reader



lalu setelah itu kita coba untuk menggunakan login editor


lalu setelah itu kita coba untuk menggunakan login admin, dan saya akan merubah post ini jadi untuk user 4 (editor)


lalu kita akan menerapkan pada fungsi read, create dan delete juga sesuai dengan police nya masing masing

Fungsi Read


lalu kita akan coba menggunakan user editor untuk mencobanya



Fungsi Create
    

dan kita akan mencobanya dengan user editor



Fungsi Delete

dan kita akan mencobanya dengan user editor


Endpoint Untuk Reader 

untuk user reader agar bisa melakukan Read All dan Read Detail. Untuk mengakomodir kebutuhan ini kita akan membuat routes dan controller baru.


masuk ke web/routes.php lalu tambahkan endpoint yang diinginkan


Buka kembali file app/Providers/AuthServiceProvider.php, tambahkan sintak seperti dibawah ini.

Lalu buat controller app/Http/Controllers/Publik/PostsController.php seperti dibawah ini

<?php
namespace 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($response200);
            }
            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);
        }
    }   
}

Lalu setelah itu coba panggil endpoint yang baru pada postman dengan menggunakan login reader



Sekian tutorial mengenai Lumen Service App -  Authorization, mohon maaf apabila banyak sekali kekurangan

Terima kasih

Next Post Previous Post
No Comment
Add Comment
comment url