Membuat Multiple Role User Dengan Middleware Route Laravel

Membuat Multiple Role User Dengan Middleware Route Laravel
Konten Halaman

Di kesempatan kali ini saya mau berbagi pengalaman menggunakan middleware di Laravel untuk membuat multi user.
Middleware Laravel adalah salah satu fitur untuk mekanisme memeriksa dan memfilter permintaan HTTP yang masuk ke aplikasi kita.

Maka ketika user misalkan melakukan akses ke route tertentu dan melakukan autentikasi, dengan kondisi tidak terpenuhi maka tidak di izinkan untuk mengaksesnya atau bisa juga ketika user mengakses suatu route middleware akan memverifikasi bahwa pengguna aplikasi kita diautentikasi. Jika pengguna tidak diautentikasi, middleware akan mengarahkan pengguna ke halaman login aplikasi anda.

Di studi kasus kali ini saya akan melanjutkan file project dari Membuat REST API CRUD dengan Laravel serta JWT

Mendefinisikan Middleware

Membuat middleware di Laravel bisa menggunakan artisan atau langsung create file di ..\app\Http\Middleware pilih salah satu caranya.

  • membuat middleware dengan artisan :
php artisan make:middleware EnsureUserHasRole
  • membuat middleware manual dengan create file di di ..\app\Http\Middleware file baru akan seperti berikut:
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class EnsureUserHasRoleXXX
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        return $next($request);
    }
}
  • selanjutnya ubah kodingan yang ada di atas menjadi seperti di bawah ini :
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class EnsureUserHasRole
{
    public function handle(Request $request, Closure $next, $role)
    {
        if (! $request->user()->hasRole($role)) {
           return response()->json(['message' => 'tidak bisa mengakses, karena anda bukan bagian role '.$role]);
        }

        return $next($request);
    }
}

Penjelasan :

  • public function handle(Request $request, Closure $next, $role) di parameter terakhir terdapat $role yang artisnya ketika di panggil di route akan diteruskan lagi nilainya ke dalam method handle() ini.

  • $request->user()->hasRole($role) bagian ini untuk mengecek ke model dan jangan lupa tambahkan di model yang ada di \app\Models\User.php seperti berikut untuk pengecekan role :

    ...
    public function hasRole($role){
        if ($this->role == $role) {
            return true;
        }

        return false;
    }
    ...
  • dari kodingan di atas kita akan mengembalikan boolean. methode di atas dipanggil di middleware yang sebelumnya kita buat.

Mendefinikasn di kernel middleware

  • buat nama file sama dengan nama class maka simpan kode PHP di atas dengan nama file EnsureUserHasRole.php
  • selanjutnya menambahkan baris kode di ..\app\Http\Kernel.php seperti di bawah ini:
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

        /* Custom Middleware */
        'role' => \App\Middleware\EnsureUserHasRole::class,
    ];

Penjelasan :

  • 'role' => \App\Middleware\EnsureUserHasRole::class di bagian paling bawah saya menambahkan custom middleware yang kita buat.

Menambah method baru di controller

Di tahap ini kita akan mengeluarkan data semua user yang terdaftar maka syntaxnya:

  public function getAllUsers()
  {
    $users       = (new User())->all();
    return response()->json($users, 200);
  }

Penjelasan :

  • syntax di atas di tambahkan di file\app\Http\Controllers\UserController.php

Implementasi Middleware di Routes

Menambahkan route baru di ..routes\api.php seperti berikut ini:

  ...
    Route::get('/users', [UserController::class, 'getAllUsers'])->middleware('role:super-user');
  ...

Penjelasan :

  • ->middleware('role:super-user'); : memanggil middleware untuk route tertentu, jadi ketika route di panggil dan kondisi role di table user tidak memiliki value super-user seperti yang didefinisikan maka akan di tulak.

  • untuk mencobanya mari kita panggil url http://127.0.0.1:8000/api/users dengan HTTP method GET, jika berhasil respons akan seperti berikut contohnya :

[
    {
        "id": 2,
        "name": "Sigit",
        "email": "[email protected]",
        "email_verified_at": null,
        "role": "user",
        "created_at": "2023-01-22T10:09:40.000000Z",
        "updated_at": "2023-01-22T10:09:40.000000Z"
    },
    {
        "id": 3,
        "name": "Sigit",
        "email": "[email protected]",
        "email_verified_at": null,
        "role": "super-user",
        "created_at": "2023-01-22T10:15:30.000000Z",
        "updated_at": "2023-01-22T10:15:30.000000Z"
    }
]

dan jika user buka role super-user maka response :

{
    "message": "tidak bisa mengakses, karena anda bukan bagian role super-user"
}