laravel gate | java php laravel linux mysql sql bootstrap html css query java php laravel linux mysql sql bootstrap html css query: laravel gate

Sunday, April 12, 2026

laravel gate

📚 Seri Belajar Laravel Lengkap — Artikel 23 dari 50

Otorisasi dengan Gates
dan Policies di Laravel

Pelajari cara membatasi akses fitur secara cerdas di Laravel — dari konsep Gates yang simpel hingga Policies yang terstruktur rapi, lengkap dengan contoh kode siap pakai.

#Laravel #Otorisasi #Gates & Policies #PHP #Web Security
⏱️
Estimasi Baca
12 Menit
🎯
Level
Intermediate
📅
Diperbarui
2025

Bayangkan kamu punya aplikasi web — dan tiba-tiba pengguna biasa bisa menghapus data milik orang lain. Serem, kan? Ini bukan sekadar bug, ini celah keamanan serius. Nah, di sinilah otorisasi berperan. Kalau kamu sudah familiar dengan autentikasi Laravel Breeze untuk proses login, saatnya naik level: kita bahas bagaimana Laravel mengontrol siapa boleh melakukan apa setelah pengguna berhasil masuk.

Di artikel ke-23 dari seri 50 Artikel Belajar Laravel ini, kita akan bedah tuntas dua senjata utama Laravel untuk otorisasi: Gates dan Policies. Kamu akan paham kapan memakai yang mana, cara implementasinya, dan bagaimana mengintegrasikannya ke Blade template serta controller. Siap? Mari mulai!

🔑 Definisi Kunci

"Autentikasi = siapa kamu. Otorisasi = apa yang boleh kamu lakukan."

Gates adalah closure sederhana untuk cek izin yang tidak terkait dengan model tertentu. Policies adalah class yang mengorganisir logika otorisasi di seputar satu Eloquent model. Keduanya saling melengkapi dalam ekosistem autentikasi Laravel Breeze dan beyond.

🔐 Autentikasi vs Otorisasi: Jangan Sampai Ketukar!

Banyak developer — terutama yang baru kelar setup autentikasi Laravel Breeze — mengira pekerjaan keamanan sudah selesai begitu login berjalan. Padahal, autentikasi baru separuh cerita.

Analoginya begini: autentikasi adalah petugas pintu masuk yang ngecek KTP kamu. Tapi setelah masuk gedung, bukan berarti kamu bisa masuk ke semua ruangan, kan? Nah, otorisasi adalah satpam yang jagain tiap ruangan — memastikan kamu hanya masuk ke tempat yang memang jadi hakmu.

Aspek 🔑 Autentikasi 🛡️ Otorisasi
Pertanyaan utama Siapa kamu? Apa yang boleh kamu lakukan?
Tool Laravel Breeze, Jetstream, Sanctum Gates & Policies
Contoh aksi Login, register, logout Edit post, hapus user, lihat dashboard
Kapan dicek? Saat masuk aplikasi Saat mengakses fitur/resource tertentu
💡
Tips Praktis

Selalu setup autentikasi dulu sebelum otorisasi. Gunakan php artisan breeze:install untuk scaffolding autentikasi Laravel Breeze yang cepat, lalu lanjutkan dengan Gates dan Policies untuk kontrol akses yang lebih granular.

⚡ Gates: Si Penjaga Simpel yang Powerful

Gates adalah cara paling straightforward untuk mendefinisikan otorisasi di Laravel. Bayangkan Gates seperti daftar tamu VIP di sebuah acara — kamu cukup tulis "siapa boleh masuk" dalam satu baris kode, dan Laravel yang akan ngecek setiap kali dibutuhkan.

Gates didefinisikan di dalam AuthServiceProvider menggunakan method Gate::define(). Berikut langkah-langkahnya:

1
Buka AuthServiceProvider

Temukan file di app/Providers/AuthServiceProvider.php. Di sinilah semua Gates kamu didaftarkan dalam method boot().

AuthServiceProvider.php
// app/Providers/AuthServiceProvider.php

use Illuminate\Support\Facades\Gate;
use App\Models\Post;

public function boot(): void
{
    // Gate sederhana: cek apakah user adalah admin
    Gate::define('is-admin', function (User $user) {
        return $user->role === 'admin';
    });

    // Gate dengan model: cek apakah user bisa edit post
    Gate::define('edit-post', function (User $user, Post $post) {
        return $user->id === $post->user_id;
    });
}
2
Gunakan Gate di Controller

Ada tiga cara memanggil Gate: allows(), denies(), atau authorize() yang otomatis throw exception 403.

PostController.php
use Illuminate\Support\Facades\Gate;

public function edit(Post $post)
{
    // Cara 1: Manual check
    if (Gate::denies('edit-post', $post)) {
        abort(403, 'Akses ditolak!');
    }

    // Cara 2: Auto throw 403 jika gagal (lebih ringkas)
    Gate::authorize('edit-post', $post);

    return view('posts.edit', compact('post'));
}
3
Gunakan Gate di Blade Template

Directive Blade @can dan @cannot membuat view jadi bersih dan readable.

posts/show.blade.php
{{-- Tampilkan tombol Edit hanya jika user boleh --}}
@can('edit-post', $post)
    <a href="{{ route('posts.edit', $post) }}">
        ✏️ Edit Post
    </a>
@endcan

{{-- Tampilkan pesan jika user adalah admin --}}
@can('is-admin')
    <div>🛡️ Kamu adalah Administrator</div>
@endcan
Insight Penting

Gates ideal untuk aturan otorisasi yang sederhana dan tidak terikat model tertentu. Misalnya: "apakah user ini admin?", "bolehkah akses halaman pengaturan?". Kalau logika mulai kompleks dan terikat ke model Eloquent, saatnya beralih ke Policies.

🏛️ Policies: Otorisasi yang Terstruktur dan Elegan

Kalau Gates itu seperti catatan tempel di kulkas, maka Policies adalah buku peraturan lengkap yang tersusun rapi per bab. Policies adalah class PHP khusus yang mengelompokkan semua logika otorisasi untuk satu model Eloquent. Ini adalah pendekatan yang direkomendasikan untuk aplikasi skala menengah ke atas.

Laravel menyediakan artisan command untuk generate Policy secara otomatis, termasuk method standar CRUD yang siap diisi.

1
Generate Policy via Artisan

Jalankan command berikut di terminal untuk membuat Policy baru. Flag --model otomatis mengisi method CRUD standar.

$ terminal
php artisan make:policy PostPolicy --model=Post
2
Isi Logika di PostPolicy

Setiap method di Policy menerima user dan model sebagai parameter, lalu mengembalikan true (izin) atau false (tolak).

app/Policies/PostPolicy.php
namespace App\Policies;

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

class PostPolicy
{
    // User bisa lihat semua post (termasuk tamu)
    public function viewAny(?User $user): bool
    {
        return true;
    }

    // Hanya pemilik yang bisa edit
    public function update(User $user, Post $post): bool
    {
        return $user->id === $post->user_id;
    }

    // Admin bisa hapus post siapapun
    public function delete(User $user, Post $post): bool
    {
        return $user->id === $post->user_id 
            || $user->role === 'admin';
    }
}
3
Daftarkan Policy di AuthServiceProvider

Hubungkan model ke Policy-nya di array $policies. Laravel 11 ke atas melakukan auto-discovery, tapi mendaftarkannya secara eksplisit lebih aman.

AuthServiceProvider.php
protected $policies = [
    Post::class => PostPolicy::class,
];
4
Gunakan Policy di Controller

Method $this->authorize() di controller secara otomatis memanggil Policy yang sesuai.

PostController.php
public function update(Request $request, Post $post)
{
    // Otomatis panggil PostPolicy::update()
    $this->authorize('update', $post);

    $post->update($request->validated());
    return redirect()->route('posts.show', $post);
}

// Atau gunakan middleware di route
public function __construct()
{
    $this->authorizeResource(Post::class, 'post');
}
🔥
Fakta Menarik

Method authorizeResource() di constructor controller secara ajaib memetakan 7 method CRUD (index, create, store, show, edit, update, destroy) ke Policy yang sesuai — hanya dengan satu baris kode! Ini salah satu fitur yang bikin Laravel sangat produktif dibanding framework lain.

🤔 Gates vs Policies: Panduan Memilih yang Tepat

Setelah menguasai keduanya — seperti yang sudah kamu pelajari di seri ini mulai dari setup autentikasi Laravel Breeze hingga middleware — pertanyaan berikutnya adalah: kapan harus pakai Gates, dan kapan Policies lebih cocok?

🔬 Analisis Perbandingan: Gates vs Policies
⚡ Gunakan Gates jika...
  • Aturan sederhana & tidak terkait model
  • Cek global seperti "apakah admin?"
  • Otorisasi lintas resource
  • Prototype cepat atau aplikasi kecil
  • Logika yang hanya muncul 1-2 tempat
🏛️ Gunakan Policies jika...
  • Aturan terkait model Eloquent tertentu
  • Banyak action berbeda untuk 1 resource
  • Tim besar dengan banyak developer
  • Aplikasi skala menengah ke atas
  • Butuh organisasi kode yang bersih
⚠️
Perhatian!

Jangan lupa: Gate dan Policy hanya menyembunyikan UI di Blade template, tapi kamu harus tetap cek otorisasi di controller/backend! Banyak developer junior yang cuma pakai @can di Blade tapi lupa $this->authorize() di controller — ini celah keamanan!

💡
Pro Tip: Super Admin

Gunakan Gate::before() untuk memberikan akses penuh ke super admin tanpa harus modifikasi setiap Policy satu per satu:

Gate::before(function (User $user, string $ability) {
    if ($user->role === 'super-admin') {
        return true; // Skip semua cek lainnya
    }
});
✅ Kesimpulan

Siap Jadi Laravel Security Pro?

Di artikel ini, kamu sudah belajar tiga hal penting: pertama, perbedaan mendasar antara autentikasi (siapa kamu) dan otorisasi (apa yang boleh dilakukan). Kedua, cara implementasi Gates untuk aturan sederhana menggunakan closure di AuthServiceProvider. Ketiga, cara membuat Policies yang terstruktur untuk resource berbasis model Eloquent.

Ingat prinsip utamanya: selalu cek otorisasi di dua lapisan — Blade untuk UI dan controller untuk backend. Kombinasi autentikasi Laravel Breeze + Gates/Policies adalah fondasi keamanan aplikasi web yang solid. Di artikel berikutnya, kita akan naik level lagi dengan sistem Role dan Permission yang lebih kompleks!

💬 Tulis Komentar 🔔 Subscribe Seri Ini atau bagikan artikel ini ke teman yang butuh! 🚀
🏷️ Tags Artikel
#Laravel #PHP #Otorisasi #Gates #Policies #WebSecurity #BelajarLaravel #AutentikasiLaravelBreeze
📚 Navigasi Seri — 50 Artikel Belajar Laravel

Artikel ini adalah bagian dari Seri Belajar Laravel Lengkap — 50 Artikel. Ikuti semua artikel untuk menjadi Laravel developer yang handal! 🚀

No comments:

Post a Comment

saifiahmada.com adalah blog belajar programming Indonesia, membahas lengkap materi bahasa pemrograman: code HTML, CSS, Bootstrap, Desain, PHP, MySQL, coding Java, Query, SQL, dan dunia linux