Membuat Multiple Role User Dengan Middleware Route Laravel
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\Middlewarefile 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$roleyang artisnya ketika di panggil di route akan diteruskan lagi nilainya ke dalam methodhandle()ini. -
$request->user()->hasRole($role)bagian ini untuk mengecek ke model dan jangan lupa tambahkan di model yang ada di\app\Models\User.phpseperti 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.phpseperti 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::classdi 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 kondisiroledi table user tidak memiliki valuesuper-userseperti yang didefinisikan maka akan di tulak. -
untuk mencobanya mari kita panggil url
http://127.0.0.1:8000/api/usersdengan 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"
}