Jika seorang pengguna Laravel 8 ingin membatasi hak akses halaman / modul tertentu, pasti membutuhkan middleware.
… karena dengan middleware kita bisa membatasi izin terhadap user untuk mengakses halaman tertentu yang memiliki syarat.
Misalnya harus login terlebih dahulu.
Harus upgrade ke akun PRO.
Perlu aktivasi akun.
… dan masih banyak lagi.
Sama halnya kalau kita mau masuk ke rumah orang lain, pasti perlu izin terlebih dahulu kan?
Pasti jawabannya iya.
Jadi… kita tidak bisa mengakses halaman tertentu sebelum diizinkan oleh middleware.
Gambarannya seperti ini:
Melalui gambar di atas, kita bisa membayangkan bahwa user akan melewati middleware terlebih dahulu sebelum mengakses controller.
Masih bingung?
Coba baca dulu apa manfaat middleware.
Apa Manfaat Middleware?
Dengan menggunakan middleware di Laravel 8, maka kita akan mendapatkan manfaat sebagai berikut:
- Sebagai penengah antara request yang masuk dengan controller yang dituju.
- Dapat mencegat request yang masuk untuk diproses terlebih dahulu sebelum masuk ke controller.
- Reusable, dapat digunakan berkali-kali tanpa harus membuat ulang.
- Keamanan menjadi lebih baik.
Keren.
Berarti sudah saatnya kita mulai ngoding.
Step By Step Membuat Middleware di Laravel 8
Kita sudah mengenal middleware dengan penjelasan di atas.
Kalau belum paham, sebaiknya jangan dulu dilanjutkan.
… khawatir akan bingung.
Kalau memang sudah mengerti, kita mulai dari membuat project baru.
Step 1 – Membuat Project Baru Laravel 8
Gunakan composer untuk melakukan installasi Laravel 8. Silahkan ketik command di bawah ini untuk menginstall Laravel 8.
composer create-project --prefer-dist laravel/laravel laravel8_middleware
Baca Juga: Fitur dan Ulasan Terbaru Laravel 8 yang Perlu Kamu Tahu
Untuk membuka projectnya, kita bisa menggunakan Visual Studio Code, Sublime Text, Atom dan lain-lain.
Kebetulan saya menggunakan Visual Studio Code.
Jadi… Silahkan open project yang sudah berhasil kita install melalui composer di VS Code.
Hasilnya seperti ini:

Step 2 – Konfigurasi Database dan Environment
Pertama-tama kita buat dulu dabatasenya.
Beri nama db_laravel_8_middleware
.
Kemudian kita buka file laravel8_middleware/.env
dan cari kode berikut:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=
Ubah menjadi:
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=db_laravel_8_middleware DB_USERNAME=root DB_PASSWORD=
Penjelasan:
Setting konfigurasi di atas menyesuaikan dengan standart mysql pada umumnya.
Jika kamu menggunakan Nginx, MAMP, Linux dll, silahkan sesuaikan konfigurasi port, username dan passwornya.
Mari kita lanjut …
Step 3 – Melakukan Migrate Table User
Saat melakukan installasi, Laravel 8 sudah menyediakan migration table users
berserta model User
.
Untuk keperluan middleware sederhana, kita perlu menambahkan field role
yang isinya untuk membedakan level user.
Field ini sangat dibutuhkan pada saat membuat middleware nanti.
Caranya, silahkan buka file laravel8_middeware/database/migrations/2014_10_12_000000_create_users_table.php
.
Kemudian, tambahkan kode seperti baris ke 18 di bawah ini:
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateUsersTable extends Migration { public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('email')->unique(); $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); $table->string('role'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('users'); } }
Seperti yang sudah dijelaskan, field ini sangat dibutuhkan pada saat membuat middleware nanti.
Jangan lupa simpan kembali filenya.
Jika sudah … Sekarang kita migrate.
Ketik kode berikut ini:
php artisan migrate

Setelah ini apa yang harus kita lakukan?
Baca Juga: Tutorial CRUD Laravel 8 untuk Pemula
Step 4 – Membuat Data User Seeder
Seed adalah salah satu fitur yang disediakan oleh Laravel. Fungsinya untuk mengisi data pada table sesuai dengan nama table, nama field dan value dari setiap field yang kita tentukan.
… dengan Seed, kita ngak perlu repot-repot melakukan insert langsung pada database. Cukup gunakan script dan simsalabim …. langsung ke insert.
Seed juga memudahkan kita sharing data kepada tim.
Gimana cara membuatnya? Cukup ketik command di bawah ini pada terminal:
php artisan make:seed UserSeeder
Jika berhasil, silahkan buka file UserSeeder.php
yang ada di dalam direktori database/seeders
.
Modifikasi file tersebut menjadi seperti ini:
<?php namespace Database\Seeders; use Illuminate\Database\Seeder; use Hash; use DB; class UserSeeder extends Seeder { public function run() { DB::table('users')->insert([ 'name' => 'Admin', 'email' => 'admin@gmail.com', 'password' => Hash::make('admin123'), 'role' => 'admin', 'created_at' => \Carbon\Carbon::now(), 'email_verified_at' => \Carbon\Carbon::now() ]); DB::table('users')->insert([ 'name' => 'User', 'email' => 'user@gmail.com', 'password' => Hash::make('user123'), 'role' => 'user', 'created_at' => \Carbon\Carbon::now(), 'email_verified_at' => \Carbon\Carbon::now() ]); } }
Pada baris ke 17 dan 25, saya membuat 2 buah role, yaitu admin
dan user
.
… tujuannya untuk membedakan antara admin dan user.
Selain itu, ini akan berpengaruh mana route yang dapat diakses oleh admin dan mana yang dapat diakses oleh user.
Sekarang, buka file DatabaseSeeder.php
yang ada di dalam direktori database/seeders
.
Tambahkan kode pada baris ke di bawah ini:
<?php namespace Database\Seeders; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder { public function run() { $this->call(UserSeeder::class); } }
Fungsinya untuk memanggil class UserSeeder pada saat seed dijalankan.
Untuk menjalankannya, ketik command di bawah ini pada terminal:
php artisan db:seed

Oke sampai di sini sudah selesai seed-nya.
Sekarang, mari kita buat untuk proses Authenticationnya.
Step 5 – Membuat Laravel 8 Authentication Versi Bootstrap
Di sini saya menggunakan bootstrap pada proses authenticationnya.
… karena saya yakin, sudah banyak yang mengenal library ini.
So, Laravel 8 memisahkan diri dengan proses Auth.
Sekarang kita mesti install secara mandiri.
Kerennya, kita bisa memilih mau menggunakan Bootstrap, Vue, React dan lainnya.
… kebetulan, kita gunakan bootstrap aja.
Yuk mulai …
Ketik command di bawah ini:
composer require laravel/ui
Kemudian kita install Auth versi bootstrap, caranya dengan command di bawah ini:
php artisan ui bootstrap --auth
Selanjutnya, kita akan diminta untuk ketik command npm install && npm run dev
.
Untuk melakukannya, pastikan perangkat yang gunakan sudah terinstall Node Js ya.
Jika sudah, langsung saja ketik command di bawah ini:
npm install && npm run dev
Sekarang persiapan authentication sudah lengkap.
Sebab sudah terdapat controller untuk Login, Register nya.
Kita tinggalkan dulu modifikasi pada bagian ini.
Sejenak kita lompat ke pembuatan middlewarenya.
Step 6 – Membuat Middleware Laravel 8 untuk Admin dan User
Oke, saatnya kita membuat middleware untuk admin di Laravel 8 terlebih dahulu.
Langkah 1 – Membuat Middleware Admin
Caranya ketik command di bawah ini:
php artisan make:middleware AdminMiddleware
Sekarang buka file AdminMiddleware.php
pada direktori App/Http/Middleware
.
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Auth; class AdminMiddleware { public function handle(Request $request, Closure $next) { if(Auth::user()->role != "admin"){ /* silahkan modifikasi pada bagian ini apa yang ingin kamu lakukan jika rolenya tidak sesuai */ return redirect()->to('logout'); } return $next($request); } }
Pada baris ke 7, saya memanggil Auth.
Sedangkan pada baris ke 13-15 kita menulis kode yang berfungsi untuk mengecek apabila bukan role admin, maka akan langsung logout secara otomatis.
… di sini, kita bisa memodifikasi apa yang akan terjadi apabila bukan role admin.
Misalnya redirect ke suatu route, mendapatkan session flash dan lain sebagainya.
Sekarang kita buat middleware untuk bagian user.
Langkah 2 – Membuat Middleware User
Ketik command di bawah ini:
php artisan make:middleware UserMiddleware
… kemudian ubah kodenya menjadi:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Auth; class UserMiddleware { public function handle(Request $request, Closure $next) { if(Auth::user()->role != "user"){ /* silahkan modifikasi pada bagian ini apa yang ingin kamu lakukan jika rolenya tidak sesuai */ return redirect()->to('logout'); } return $next($request); } }
Penjelasannya sama persis dengan admin di atas.
Langkah 3 – Mendaftarkan Middleware yang Sudah Dibuat di Laravel 8
Buka file Kernel.php
pada direktori App/Http
.
Tambahkan baris ke 11-12 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, 'admin' => \App\Http\Middleware\AdminMiddleware::class, 'user' => \App\Http\Middleware\UserMiddleware::class, ];
Lalu simpan.
Apa tujuannya?
Karena kita mendaftarkannya di $routeMiddleware
, jadi nama admin
dan user
dapat kita gunakan pada saat melakukan group nama route yang mana dapat diakses admin dan mana yang dapat diakses user.
Step 7 – Membuat Controller untuk Dashboard Admin dan User
Kita sudah punya controller untuk bagian Auth.
Sekarang saatnya kita membuat halaman khusus yang hanya dapat diakses oleh role yang bersangkutan.
Silahkan buat controller untuk Admin terlebih dahulu.
php artisan make:controller AdminController
dan …
php artisan make:controller UserController
… lalu buat masing-masing function index pada controller di atas.
Berikut kode untuk controller AdminController.php
:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Auth; class AdminController extends Controller { public function index() { $user = Auth::user(); return view('admin.home', compact('user')); } }
… dan ini untuk UserController.php:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Auth; class UserController extends Controller { public function index() { $user = Auth::user(); return view('user.home', compact('user')); } }
Persiapan controller selesai.
Mari kita lanjut…
Step 8 – Membuat Halaman View untuk Masing-masing Role
Buat 2 buah folder bernama admin
dan user
di direktori resources/views
.
Pada masing-masing folder buat file bernama home.blade.php

Sekarang kita ketik kode kedua home.blade.php
di atas menjadi seperti di bawah ini:
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Dashboard {{ $user->name }}</div> <div class="card-body"> @if (session('status')) <div class="alert alert-success" role="alert"> {{ session('status') }} </div> @endif <p><strong>Selamat datang {{ $user->name }}!</strong> Anda telah melakukan login sebagai {{ $user->role }}</p> </div> </div> </div> </div> </div> @endsection
Mantap.
Step 9 – Mengatur Middleware Admin dan User pada Route
Silahkan buka routes/web.php
.
Kita modifikasi menjadi:
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\AdminController; use App\Http\Controllers\UserController; Route::get('/', function () { return view('welcome'); }); Auth::routes(); Route::middleware(['auth'])->group(function () { Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); Route::middleware(['admin'])->group(function () { Route::get('admin', [AdminController::class, 'index']); }); Route::middleware(['user'])->group(function () { Route::get('user', [UserController::class, 'index']); }); Route::get('/logout', function() { Auth::logout(); redirect('/'); }); });
Penjelasan:
Route admin hanya dapat diakses apabila ia lolos dari Middleware Admin. Begitupun dengan route user tidak akan bisa diakses kecuali kalau dia lolos dari Middleware User.
Route logout sebenernya sudah tersedia di Route::routes(), hanya saja ia hanya bisa diakses dengan method POST.
… sedangkan pada middleware, kita memanggilnya dengan method GET.
Jadi, nggak masalah kita buat route logout khusus dengan method GET.
Step 10 – Modifikasi HomeController
Jika kita menggunakan Laravel Mix untuk Scaffold / Auth, by default setiap kali berhasil login atau register akan diarahkan ke route home.
Sebenarnya kita bisa melakukan custom pada bagian itu.
… hanya saja tutorial ini akan semakin panjaaaanggggggg.
Maka izinkan saya mempersingkatnya dengan sedikit memodifikasi pada file HomeController.php di direktori App/Http/Controllers.
Ubah kodenya menjadi seperti di bawah ini:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Auth; class HomeController extends Controller { public function __construct() { $this->middleware('auth'); } public function index() { $role = Auth::user()->role; if($role == "admin"){ return redirect()->to('admin'); } else if($role == "user"){ return redirect()->to('user'); } else { return redirect()->to('logout'); } } }
Simple sih.
Kalau ia login akan kita redirect ke halaman yang sesuai dengan rolenya.
Melakukan Testing Middleware Laravel 8
Silahkan jalankan project dengan mengetik command di bawah ini:
php artisan migrate
Halaman URL untuk login:
http://127.0.0.1:8000/login
Halaman URL untuk register:
http://127.0.0.1:8000/login
Halaman dashboard admin:
http://127.0.0.1:8000/admin
Halaman dashboard user:
http://127.0.0.1:8000/user
Penutup
Alhamdulillah kita telah menyelesaikan tutorial lengkap membuat middleware sendiri menggunakan Laravel 8.
Semoga tutorial ini dapat membantu teman-teman membuat project menggunakan Laravel 8.
Baca Juga: Tutorial Membuat Fitur Auth Sederhana di Laravel 8
Harapannya, project yang dikerjakan akan lebih keren lagi ke depannya.
Aamiin.
Oh iya, jika membutuhkan source code project ini, silahkan download melalui link github di bawah ini:
Semoga bermanfaat…