Kembali ke Artikel
10 November 2025
Diperbarui: 8 September 2026

Apa Itu Policy dan Gate di Laravel 12: Sistem Otorisasi yang Tepat

Bayangkan ada dua pertanyaan berbeda soal keamanan di aplikasi Anda: “Apakah user ini boleh edit artikel?” dan “Apakah user yang login adalah editor?”

Pertanyaan pertama terkait Policy: otorisasi berdasarkan resource. Pertanyaan kedua terkait Gate: otorisasi berdasarkan kemampuan/role. Keduanya bagian dari sistem Authorization di Laravel.

Apa Itu Gate?

Gate adalah cara mendefinisikan otorisasi berbasis kemampuan (ability) secara sederhana, biasanya untuk aksi yang tidak terkait langsung dengan model tertentu.

Definisikan Gate di app/Providers/AppServiceProvider.php:

<?php

namespace AppProviders;

use AppModelsUser;
use IlluminateSupportFacadesGate;
use IlluminateSupportServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        Gate::define('access-admin-panel', function (User $user) {
            return $user->role === 'admin';
        });

        Gate::define('manage-settings', function (User $user) {
            return in_array($user->role, ['admin', 'superadmin']);
        });
    }
}

Gunakan di controller atau view:

// Di controller
if (Gate::denies('access-admin-panel')) {
    abort(403);
}

// Dengan authorize (auto-throw 403 jika gagal)
Gate::authorize('access-admin-panel');

// Di Blade
@can('access-admin-panel')
    <a href="/admin">Admin Panel</a>
@endcan

Apa Itu Policy?

Policy adalah kelas yang mengelompokkan logika otorisasi untuk satu model. Cocok untuk otorisasi seperti “siapa yang boleh edit, hapus, atau lihat resource ini?”

php artisan make:policy ArticlePolicy --model=Article

File dibuat di app/Policies/ArticlePolicy.php:

<?php

namespace AppPolicies;

use AppModelsArticle;
use AppModelsUser;

class ArticlePolicy
{
    public function viewAny(User $user): bool
    {
        return true; // Semua user bisa lihat daftar artikel
    }

    public function view(User $user, Article $article): bool
    {
        // Bisa lihat kalau published, atau kalau milik sendiri
        return $article->status === 'published' || $article->user_id === $user->id;
    }

    public function create(User $user): bool
    {
        return $user->hasVerifiedEmail();
    }

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

    public function delete(User $user, Article $article): bool
    {
        // Pemilik dan admin bisa hapus
        return $article->user_id === $user->id || $user->role === 'admin';
    }
}

Registrasi Policy

Di Laravel 12, policy otomatis ditemukan (auto-discovery) kalau struktur folder sesuai konvensi. Tapi Anda juga bisa register manual di AppServiceProvider:

use AppModelsArticle;
use AppPoliciesArticlePolicy;
use IlluminateSupportFacadesGate;

Gate::policy(Article::class, ArticlePolicy::class);

Menggunakan Policy

// Di controller
public function edit(Article $article)
{
    $this->authorize('update', $article); // Throw 403 kalau tidak bisa

    return view('articles.edit', compact('article'));
}

// Cek tanpa throw exception
if ($request->user()->can('update', $article)) {
    // boleh lanjut
}

// Di Blade
@can('update', $article)
    <a href="{{ route('articles.edit', $article) }}">Edit</a>
@endcan

@cannot('delete', $article)
    <p>Anda tidak bisa hapus artikel ini.</p>
@endcannot

Gate vs Policy: Kapan Pakai Yang Mana?

Kondisi Gunakan
Otorisasi terkait satu model (Article, Order, dll.) Policy
Otorisasi berdasarkan role/kemampuan global Gate
Aturan sederhana yang tidak butuh kelas terpisah Gate
Banyak aturan berbeda untuk satu model Policy

Baca Juga

Butuh tim yang bantu implementasi sistem otorisasi yang aman di aplikasi Laravel? Lihat layanan pengembangan aplikasi kami.

Tag: #laravel #php #tutorial
BACA JUGA

Artikel Lainnya di Kategori Laravel

Laravel

9 November 2025

Perbedaan Laravel Volt dan Laravel Breeze: Kapan Pakai Yang Mana?

Saat mulai proyek Laravel baru, salah satu pertanyaan yang sering muncul adalah: pakai Breeze atau Volt? Keduanya dari ekosistem Laravel, tapi perannya sangat berbeda. Artikel ini menjelaskan perbedaan Laravel Volt dan Laravel Breeze, bukan untuk memilih yang “lebih baik”, tapi untuk memahami kapan masing-masing dipakai. Laravel Breeze: Starter Kit Autentikasi Laravel Breeze adalah starter kit […]

Baca Artikel
laravel Laravel

9 November 2025

Membuat Controller di Laravel 11

Pada artikel ini kita akan membahas cara membuat controller di laravel 11 secara praktis, dari persiapan lingkungan hingga implementasi praktis dan best practice. Laravel sebagai framework PHP modern memudahkan pengelolaan arsitektur aplikasi dengan konsep controller, routing, dan dependency injection. Dalam konteks proyek nyata, memahami cara membangun controller yang bersih, terstruktur, dan maintainable adalah pondasi utama. […]

Baca Artikel
Laravel

9 November 2025

Notification di Laravel 12: Email, Database, dan Channel Kustom

Hampir semua aplikasi web butuh notifikasi: konfirmasi order, reset password, atau pemberitahuan saat ada komentar baru. Laravel punya sistem notifikasi yang cukup fleksibel: satu kelas bisa kirim ke email, database, Slack, dan channel lain sekaligus. Artikel ini membahas cara kerja notification di Laravel 12, mulai dari membuat kelas notifikasi, kirim via email dan database, sampai […]

Baca Artikel

Ingin Membaca Artikel Lainnya?

Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.

Lihat Semua Artikel