PHP LUMEN AUTHORIZATION

 PHP LUMEN AUTHORIZATION

1.      Menambahkan Column Role Pada Table users

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 function up menjadi seperti ini

public function up()

    {

        Schema::table('users'function (Blueprint $table) {

            $table->enum('role'array('editor''admin'))->default(null)->after('password');

        });

    }

3)      Jalankan command dibawah ini pada terminal : php artisan migrate

4)      Secara default column role yang sudah terdaftar di database.

 

2.      Hak Akses Setiap Role

Setiap role memiliki hak akses berbeda :

1)      Admin :

a.       Bisa read posts

b.      Bisa read detail posts

c.       Bisa create posts

d.      Bisa update all posts

e.       Bisa delete all posts

2)      Editor

a.       Bisa read all post yang dia tulis

b.      Bisa read detail post yang dia tulis

c.       Bisa create posts

d.      Bisa update posts yang dia tulis

e.       Bisa delete posts yang di tulis

 

3.      Membuat Logika Policy Pada Setiap Fungsi

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/Provider/AuthServiceProvider.php tambahkan use App\User, dan use App\Post, lalu pada public function boot(), tambahkan code seperti dibawah ini untuk logika policy setiap fungsi

Gate::define('read-post'function ($user){

    return $user->role == 'editor' || $user->role == 'admin';

});

 

Gate::define('create-post'function($user){

    return $user->role == 'editor' || $user->role == 'admin';

});

 

Gate::define('update-post'function ($user, $post){

    if ($user->role == 'admin'){

        return true;

    } else if ($user->role == 'editor'){

        return $user->id === $post->user_id;

    } else {

        return false;

    }

});

 

Gate::define('detail-post'function ($user, $post){

    if ($user->role == 'admin'){

        return true;

    } else if ($user->role == 'editor'){

        return $user->id === $post->user_id;

    } else {

        return false;

    }

});

 

Gate::define('delete-post'function ($user, $post){

    if ($user->role == 'admin'){

        return true;

    } else if ($user->role == 'editor'){

        return $user->id === $post->user_id;

    } else {

        return false;

    }

});

 

Tambahkan use Illuminate\Support\Facades\Gate: lalu ubah PostController seperti code dibawah ini.

public function index()

    {

        // Authorization 

 

        if(Gate::denies('read-post')){

            return response()->json([

                'success' => false,

                'status' => 403,

                'message' => 'You are unauthorized'

            ], 403);

        }

 

        if (Auth::user()->role === 'admin'){

            $posts = Post::OrderBy('id''ASC')->paginate(2)->toArray();

        } else {

            $posts = Post::Where(['user_id' => Auth::user()->id])->OrderBy('id''ASC')->paginate(2)->toArray();

        }

 

        // Authorization End

 

        $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);

    }

 

    public function store(Request $request)

    {

 

        if(Gate::denies('create-post')){

            return response()->json([

                'success' => false,

                'status' => 403,

                'message' => 'You are unauthorized'

            ], 403);

        }

 

        $this->validate($request,[

            'title' => 'required|string',

            'content' => 'required|string',

            'status' => 'required|in:draft,published'

        ]);

        

        try{

            $post = new Post;

            $post->title = $request->input('title');

            $post->content = $request->input('content');

            $post->status = $request->input('status');

            $post->user_id = Auth::user()->id;

    

            $post->save();

 

            return response()->json($post201);

        } catch (\Exception $e) {

            return response()->json(['msg' => 'Post Failed'], 409);

        }

        

    }

 

    public function show($id)

    {   

        $post = Post::find($id);

 

        if(Gate::denies('detail-post'$post)){

            return response()->json([

                'success' => 'false',

                'status' => 403,

                'message' => 'You are unauthorized'

            ], 403);

        }

        

        if(!$post) {

            abort(404);

        }

        

        return response()->json($post200);

 

    }

 

    public function update(Request $request, $id)

    {

        $post = Post::find($id);

 

        if(Gate::denies('update-post'$post)){

            return response()->json([

                'success' => 'false',

                'status' => 403,

                'message' => 'You are unauthorized'

            ], 403);

        }

 

        $input = $request->all();

 

        $validationRules = [

            'title' => 'required|min:5',

            'content' => 'required|min:10',

            'status' => 'required|in:draft,published',

            'user_id' => 'required|exists:users,id'

        ];

 

        $validator = \Validator::make($input$validationRules);

 

        if($validator->fails()) {

            return response()->json($validator->errors(), 400);

        }

 

        $post->fill($input);

        $post->save();

 

        return response()->json($post200);

    }

 

    public function destroy($id)

    {

        $post = Post::find($id);

 

        if(Gate::denies('delete-post'$post)){

            return response()->json([

                'success' => false,

                'status' => 403,

                'message' => 'You are unauthorized'

            ], 403);

        }

 

        $post->delete();

 

        $msg = ['message' => 'Delete Successfuly''user_id' => $id];

 

        return response()->json($msg200);

    }

 

4.      Pengujian Melalui Postman

1)      Admin id usernya 1, tapi bisa melihat posts yang memiliki user_id 2

2)      Admin melihat detail post yang memiliki user id 3


3)      Editor dengan id user 2, read all post, karna cuma ada 2 posts yang memiliki user id 2 jadi total count 2


4)      Editor melihat detail post dengan id yang sama


5)      Editor dengan id user see detail posts ber user_id 3, jadi tidak bisa, seperti yang dikatakan diatas, editor hanya bisa update, see detail post, dan delete posts yang memiliki id sama dengan user_id pada posts.








Komentar

Postingan populer dari blog ini

KONSEP, KELEBIHAN, KEKURANGAN CONTAINERIZATION BERSERTA TEKNOLOGI DAN STUDI KASUS CONTAINERIZATION

Tutorial Lumen PHP Framework | Routing, Middleware, dan Controller

Setting Up VM and Domain