Home Paket Belajar Bootcamp Instruktur

Tutorial Laravel Authorization #2 - Membuat dan Menggunakan Gates

Pelajari sistem Authorization di Laravel dari nol hingga implementasi dalam studi kasus nyata melalui 5 episode terstruktur. Ebook ini membahas konsep Authentication vs Authorization, Gates, Policies, fitur lanjutan, hingga menggabungkan seluruh konsep dalam sebuah aplikasi blog. Setiap materi dilengkapi penjelasan konsep, contoh kode siap pakai, tabel perbandingan, dan praktik terbaik agar mudah dipahami oleh developer Laravel pemula maupun menengah.

✅ Telah dilihat 27 kali

Rating: 5.00 ⭐

... 11 June 2026, 14:31

Setelah membaca episode ini, teman-teman akan bisa:

  • Mendefinisikan Gate di AppServiceProvider
  • Menggunakan Gate di controller dengan Gate::allows() dan Gate::authorize()
  • Menampilkan/menyembunyikan elemen di Blade template menggunakan @can

1. Mendefinisikan Gate

Gate didefinisikan di method boot() dalam App\Providers\AppServiceProvider:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;
use App\Models\User;

class AppServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        // Gate sederhana: cek apakah user adalah admin
        Gate::define('manage-users', function (User $user) {
            return $user->is_admin === true;
        });

        // Gate dengan model: cek apakah user adalah pemilik postingan
        Gate::define('edit-post', function (User $user, Post $post) {
            return $user->id === $post->user_id;
        });
    }
}

Catatan: Gate selalu menerima User sebagai argumen pertama secara otomatis — teman-teman tidak perlu memanggil auth()->user() sendiri.


2. Menggunakan Gate di Controller

Ada beberapa cara menggunakan Gate di dalam controller:

Cara 1: Gate::allows() — Kembalikan boolean

use Illuminate\Support\Facades\Gate;

public function index()
{
    if (Gate::allows('manage-users')) {
        // User adalah admin, lanjutkan
    }

    // Atau sebaliknya
    if (Gate::denies('manage-users')) {
        abort(403, 'Akses ditolak.');
    }
}

Cara 2: Gate::authorize() — Otomatis lempar 403

Ini cara yang lebih ringkas. Jika Gate gagal, Laravel otomatis mengembalikan response HTTP 403.

public function index()
{
    Gate::authorize('manage-users');

    // Kode di bawah ini hanya dijalankan jika Gate lolos
    $users = User::all();
    return view('admin.users', compact('users'));
}

Cara 3: Gate dengan argumen model

public function edit(Post $post)
{
    Gate::authorize('edit-post', $post); // $post dikirim sebagai argumen kedua

    return view('posts.edit', compact('post'));
}

3. Menggunakan Gate di Blade Template

Gunakan direktif @can dan @cannot untuk menampilkan atau menyembunyikan elemen UI:

{{-- Tampilkan tombol hanya jika user boleh manage-users --}}
@can('manage-users')
    <a href="{{ route('admin.users') }}" class="btn btn-primary">
        Kelola User
    </a>
@endcan

{{-- Tampilkan pesan jika user TIDAK bisa edit --}}
@cannot('edit-post', $post)
    <p class="text-danger">teman-teman tidak bisa mengedit postingan ini.</p>
@endcannot

{{-- Menggunakan @can dengan @else --}}
@can('edit-post', $post)
    <a href="{{ route('posts.edit', $post) }}">Edit</a>
@else
    <span class="text-muted">Hanya pemilik yang bisa mengedit.</span>
@endcan

4. Menggunakan Gate via Helper $user->can()

teman-teman juga bisa menggunakan method can() langsung pada objek User:

$user = auth()->user();

if ($user->can('manage-users')) {
    // lakukan sesuatu
}

if ($user->cannot('edit-post', $post)) {
    abort(403);
}

5. Contoh Kasus Nyata: Halaman Admin

Berikut contoh lengkap penggunaan Gate untuk halaman manajemen user:

AppServiceProvider.php:

Gate::define('manage-users', function (User $user) {
    return $user->role === 'admin';
});

UserController.php:

public function index()
{
    Gate::authorize('manage-users');

    $users = User::paginate(10);
    return view('admin.users.index', compact('users'));
}

public function destroy(User $user)
{
    Gate::authorize('manage-users');

    $user->delete();
    return back()->with('success', 'User berhasil dihapus.');
}

resources/views/dashboard.blade.php:

@can('manage-users')
    <div class="card">
        <h3>Panel Admin</h3>
        <a href="{{ route('admin.users.index') }}">Kelola User</a>
    </div>
@endcan

Ringkasan Episode

  • Gate didefinisikan di AppServiceProvider::boot() menggunakan Gate::define()
  • Gate::allows() mengembalikan true/falseGate::authorize() otomatis abort 403 jika gagal
  • Di Blade, gunakan @can / @cannot untuk kontrol tampilan elemen
  • Gate bisa menerima argumen model sebagai parameter kedua

Preview Episode Berikutnya

Di Episode 3, kita masuk ke topik yang lebih powerful: Policies — membuat class Policy, mendaftarkannya ke model, dan menggunakannya di controller dan Blade.

Daftar eBook