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.

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?
| Alat | Cocok Untuk |
|---|---|
| Middleware | Membatasi akses ke halaman/route (mis. hanya admin) |
| Gate | Izin sederhana yang tidak terikat model (mis. lihat laporan) |
| Policy | Izin terkait model tertentu (mis. edit post sendiri) |
Kesalahan Umum
- Hanya menyembunyikan tombol dengan
@cantetapi lupaauthorize()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.

