September 25, 2016

Autentikasi User menggunakan role dan middleware di Framework Laravel

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.

Autentikasi User menggunakan role dan middleware di Framework Laravel

Autentikasi User menggunakan role dan middleware di Framework Laravel

Autentikasi User menggunakan role dan middleware di Framework Laravel

Autentikasi User menggunakan role dan middleware di Framework Laravel

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 :

  1. 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.
  2. 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 :

  1. Fungsi getUserRole() : untuk mengecek id role dari table user ke table role.
  2. Fungsi cekUserRole() : untuk membandingkan role di routes dengan role di user.
  3. public function role() : relationship fungsi ke model role.
  4. 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.

Autentikasi User menggunakan role dan middleware di Framework Laravel

Autentikasi User menggunakan role dan middleware di Framework Laravel

Autentikasi User menggunakan role dan middleware di Framework Laravel

Autentikasi User menggunakan role dan middleware di Framework Laravel

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.

Agus Wiji Suhariono

Memulai menulis Blog pada bulan November dari Tahun 2015. Penulis merupakan alumni dari Politeknik Negeri Malang angkatan 2011 Program Studi Manajemen Informatika, Jurusan Elektro. Penulis memulai menekuni dunia programming mulai tahun 2014 dan sekarang bekerja di Pemerintahan sebagai IT Staff.

You may also like...

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

Powered By
Best Wordpress Adblock Detecting Plugin | CHP Adblock