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\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 methodhandle()
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 kondisirole
di table user tidak memiliki valuesuper-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"
}