Assalamualaikum wr wb, pada kesempatan kali ini saya akan share postingan mengenai cara membuat autentikasi user menggunakan role dan middleware di Framework Laravel. Pada sebuah aplikasi, autentikasi merupakan hal yang harus di perhatikan. Autentikasi menjadi hal yang penting karena digunakan untuk memfilter informasi yang akan kita sajikan pada pengguna. Jika kita membuat sebuah aplikasi yang enterprise, tentunya tidak semua user di samaratkan fiturnya untuk mengakses aplikasi tersebut. Oleh karena itu kita perlu membuat sebuat user leveling atau role untuk menangani akses user sesuai dengan jabatan atau ketentuan tertentu.
Laravel menyediakan fitur untuk membuat konfigurasi autentikasi pengguna dengan mudah, dan menghemat waktu. Tetapi untuk membuat sebuah role kita perlu modifikasi route dan menambahkan sebuah middleware, karena middleware lah yang akan menjadi penengah antara request dan response.
Autentikasi user menggunakan role dan middleware di framework laravel
Pertama-tama kita buat terlebih dahulu desain database nya, pertama adalah table user yang digunakan untuk menyimpan data akun, dan tabel role yang di gunakan untuk menyimpan data role.
Tabel user :
+----------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | role_id | int(10) unsigned | NO | | 0 | | | name | varchar(255) | NO | | NULL | | | email | varchar(255) | NO | UNI | NULL | | | password | varchar(255) | NO | | NULL | | | remember_token | varchar(100) | YES | | NULL | | | created_at | timestamp | YES | | NULL | | | updated_at | timestamp | YES | | NULL | | +----------------+------------------+------+-----+---------+----------------+
Tabel Role :
+-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | nama | tinytext | NO | | NULL | | +-------+----------+------+-----+---------+----------------+
Kemudian kita buat model role dan user pada project kita. Saya akan membuat 2 buah role dengan nama level admin dan tamu, gunakan tinker untuk memasukkan data.
Scripting
Kita mulai ngoding, mulai dari pembuatan midleware, serta penambahan fungsi pada model user. Dimulai dengan membuat sebuah middleware dengan nama CekRole dengan menggunakan artisan.
php artisan make:middleware CekRole
Kemudian kita buat dua buah fungsi :
- Fungsi handle digunakan untuk membandingkan role user dan route yang di akses apakah sesuai, jika tidak sesuai maka akan di redirect dengan http status 503.
- Fungsi cekRoute digunakan untuk mengecek aksesibility route.
<?php namespace App\Http\Middleware; use Closure; class CekRole { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $roles = $this->CekRoute($request->route()); if($request->user()->hasRole($roles) || !$roles) { return $next($request); } return abort(503, 'Anda tidak memiliki hak akses'); } private function CekRoute($route) { $actions = $route->getAction(); return isset($actions['roles']) ? $actions['roles'] : null; } }
Kernel.php
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'roles' => \App\Http\Middleware\CekRole::class, ];
Jangan lupa daftarkan middleware pada kernel(App\Http\Kernel.php), kemudian lanjut kita buat fungsi pada model user.
<?php namespace App; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { /** * The attributes that are mass assignable. * * @var array */ protected $table = 'users'; protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; public function role() { return $this->belongsTo('App\Role','role_id'); } public function hasRole($roles) { $this->have_role = $this->getUserRole(); if(is_array($roles)){ foreach($roles as $need_role){ if($this->cekUserRole($need_role)) { return true; } } } else{ return $this->cekUserRole($roles); } return false; } private function getUserRole() { return $this->role()->getResults(); } private function cekUserRole($role) { return (strtolower($role)==strtolower($this->have_role->nama)) ? true : false; } }
Penjelasan :
- Fungsi getUserRole() : untuk mengecek id role dari table user ke table role.
- Fungsi cekUserRole() : untuk membandingkan role di routes dengan role di user.
- public function role() : relationship fungsi ke model role.
- hasRole : untuk membandingkan role, dengan menggunakan fungsi getUserRole() dan cekUserRole(), pada fungsi ini terdapat kondisi, is array untuk mengecek apakah role dari route berupa array atau tidak.
Kita sesuaikan juga routesnya, kita tentukan filter role apa saja yang bisa mengakses.
Route::auth(); Route::get('/home',function(){ return view('welcome'); }); Route::get('/', function () { return view('welcome'); }); Route::group(['middleware' => ['web', 'auth', 'roles']],function(){ Route::group(['roles'=>'Tamu'],function(){ Route::resource('site', 'SiteController'); }); Route::group(['roles'=>'Admin'],function(){ Route::resource('user', 'UserController'); }); });
Uji Coba
Setelah semua persiapan di atas sudah di buat, selanjutnya kita mulai uji coba, disini saya akan login dengan role sebagai admin. Role admin hanya dapat mengakses route UserController.
User dengan role admin bisa mengakses aplikasi dengan route user, tetapi ketika mengakses route site akan di redirect ke halaman error. Mudah Bukan 😀
Sekian tutorial singkat dari saya, semoga dapat bermanfaat. Terimakasih.