Middleware, Gate, dan Policy di Laravel (Hak Akses & Otorisasi Lengkap)

Setelah pengguna bisa login, pertanyaan berikutnya adalah: siapa boleh melakukan apa? Admin boleh menghapus semua data, tetapi pengguna biasa hanya boleh mengedit miliknya sendiri. Laravel menyediakan tiga alat untuk mengatur hak akses ini: Middleware, Gate, dan Policy. Artikel ini membahas ketiganya secara lengkap.

Diagram middleware, gate, dan policy Laravel
Diagram middleware, gate, dan policy Laravel

Middleware: Penjaga Gerbang Request

Middleware adalah lapisan yang memeriksa request sebelum sampai ke controller — ibarat satpam di pintu. Contoh bawaan: auth (harus login). Kita bisa membuat middleware sendiri, misalnya untuk memeriksa role admin.

Langkah 1: Membuat Middleware

php artisan make:middleware AdminMiddleware

Buka app/Http/Middleware/AdminMiddleware.php:

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class AdminMiddleware
{
    public function handle(Request $request, Closure $next)
    {
        // jika bukan admin, tolak
        if (auth()->user()->role !== 'admin') {
            abort(403, 'Halaman khusus admin.');
        }

        return $next($request); // lanjutkan ke controller
    }
}
?>

Langkah 2: Mendaftarkan Middleware

Di app/Http/Kernel.php (Laravel 10) atau bootstrap/app.php (Laravel 11), daftarkan alias:

<?php
protected $middlewareAliases = [
    'admin' => \App\Http\Middleware\AdminMiddleware::class,
];
?>

Langkah 3: Memakai di Route

<?php
Route::get('/admin/dashboard', [AdminController::class, 'index'])
    ->middleware(['auth', 'admin']);

// atau untuk banyak route
Route::middleware(['auth', 'admin'])->group(function () {
    Route::resource('users', UserController::class);
});
?>

Middleware cocok untuk membatasi akses ke halaman/route berdasarkan aturan umum.

Gate: Izin Sederhana Berbasis Logika

Gate cocok untuk pengecekan izin yang tidak terikat pada satu model tertentu — misalnya “apakah user ini boleh melihat laporan?”. Definisikan di AppServiceProvider (method boot):

<?php
use Illuminate\Support\Facades\Gate;

public function boot(): void
{
    Gate::define('lihat-laporan', function ($user) {
        return $user->role === 'admin' || $user->role === 'manajer';
    });
}
?>

Gunakan di controller:

<?php
if (Gate::allows('lihat-laporan')) {
    // tampilkan laporan
}

// atau langsung tolak jika tidak boleh
Gate::authorize('lihat-laporan');
?>

Dan di Blade dengan direktif @can:

@can('lihat-laporan')
    <a href="/laporan">Lihat Laporan</a>
@endcan

Policy: Otorisasi per Model

Policy adalah cara paling rapi untuk mengatur izin yang terkait sebuah model — misalnya “user hanya boleh mengedit post miliknya sendiri”. Buat policy:

php artisan make:policy PostPolicy --model=Post

Isi app/Policies/PostPolicy.php:

<?php
namespace App\Policies;

use App\Models\Post;
use App\Models\User;

class PostPolicy
{
    // apakah $user boleh mengubah $post?
    public function update(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }

    public function delete(User $user, Post $post): bool
    {
        return $user->id === $post->user_id || $user->role === 'admin';
    }
}
?>

Gunakan di controller lewat authorize():

<?php
public function update(Request $request, Post $post)
{
    $this->authorize('update', $post); // otomatis 403 jika tidak boleh

    $post->update($request->all());
    return redirect('/posts');
}
?>

Di Blade, sembunyikan tombol edit dari yang tidak berhak:

@can('update', $post)
    <a href="/posts/{{ $post->id }}/edit">Edit</a>
@endcan

Kapan Pakai yang Mana?

AlatCocok Untuk
MiddlewareMembatasi akses ke halaman/route (mis. hanya admin)
GateIzin sederhana yang tidak terikat model (mis. lihat laporan)
PolicyIzin terkait model tertentu (mis. edit post sendiri)

Kesalahan Umum

  • Hanya menyembunyikan tombol dengan @can tetapi lupa authorize() di controller — pengguna nakal bisa mengakses URL langsung. Selalu proteksi di controller juga.
  • Middleware belum didaftarkan — alias tidak dikenali, muncul error.
  • Policy tidak terpanggil otomatis — pastikan nama method policy cocok dan model ditemukan otomatis oleh Laravel.

Kesimpulan

Anda telah menguasai tiga lapis otorisasi Laravel: Middleware untuk menjaga akses halaman, Gate untuk izin sederhana, dan Policy untuk otorisasi per-model. Kunci keamanannya: selalu terapkan pengecekan di sisi server (controller), bukan hanya menyembunyikan tombol di tampilan. Dengan menguasai ini, Anda bisa membangun aplikasi multi-user yang aman dan profesional — menutup rangkaian seri Laravel lanjutan Anda.

Referensi: untuk pendalaman, kunjungi dokumentasi resmi Laravel.

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *