Home Paket Belajar Bootcamp Instruktur

Tutorial Laravel Authorization #4 - Fitur Lanjutan: Before, Guest, dan Middleware

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 38 kali

Rating: 5.00 ⭐

... 11 June 2026, 14:31

Setelah membaca episode ini, teman-teman akan bisa:

  • Menggunakan method before() untuk memberikan akses penuh ke super-admin
  • Membuat Policy yang mendukung user yang belum login (guest)
  • Melindungi route langsung dari routes/web.php menggunakan middleware can:

1. Method before() — Bypass untuk Super Admin

Terkadang teman-teman ingin admin bisa melakukan apa saja tanpa perlu mengecek satu per satu di setiap method. Gunakan method before() di dalam Policy:

<?php

namespace App\Policies;

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

class PostPolicy
{
    /**
     * Method ini dijalankan SEBELUM method lainnya.
     * Jika mengembalikan nilai non-null, method lainnya dilewati.
     */
    public function before(User $user, string $ability): bool|null
    {
        if ($user->role === 'admin') {
            return true; // admin boleh melakukan apa saja
        }

        return null; // lanjutkan ke pengecekan method yang sesuai
    }

    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;
    }
}

Penting: Return null (bukan false) jika teman-teman ingin method lain tetap dieksekusi. Return false akan menolak akses untuk semua ability.


2. Policy untuk User yang Belum Login (Guest)

Secara default, Laravel menolak semua akses untuk user yang belum login sebelum masuk ke Policy. Tapi teman-teman bisa mengizinkan guest dengan menambahkan ? pada type-hint User:

public function view(?User $user, Post $post): bool
{
    // Jika user belum login ($user = null), cek apakah postingan published
    if ($user === null) {
        return $post->status === 'published';
    }

    // Jika user sudah login, boleh lihat semua postingan miliknya + yang published
    return $post->status === 'published' || $user->id === $post->user_id;
}

Penggunaan di Blade:

{{-- Ini aman digunakan, meskipun user belum login --}}
@can('view', $post)
    <article>{{ $post->content }}</article>
@else
    <p>Postingan ini tidak tersedia.</p>
@endcan

3. Menggunakan Policy via Middleware Route

Cara paling ringkas untuk melindungi route adalah langsung di routes/web.php menggunakan middleware can::

use App\Models\Post;

// Proteksi satu route
Route::get('/posts/create', [PostController::class, 'create'])
    ->middleware('can:create,App\Models\Post');

// Proteksi dengan model binding
Route::put('/posts/{post}', [PostController::class, 'update'])
    ->middleware('can:update,post'); // 'post' merujuk ke route parameter {post}

Route::delete('/posts/{post}', [PostController::class, 'destroy'])
    ->middleware('can:delete,post');

Atau gunakan Route Group:

Route::middleware('auth')->group(function () {

    Route::get('/posts/create', [PostController::class, 'create'])
        ->middleware('can:create,App\Models\Post');

    Route::resource('posts', PostController::class)
        ->except(['index', 'show']);
});

4. Menggunakan Policy di Form Request

teman-teman juga bisa menaruh authorization langsung di Form Request agar controller tetap bersih:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdatePostRequest extends FormRequest
{
    /**
     * Cek apakah user berhak melakukan request ini.
     */
    public function authorize(): bool
    {
        $post = $this->route('post'); // ambil model dari route parameter
        return $this->user()->can('update', $post);
    }

    public function rules(): array
    {
        return [
            'title' => 'required|string|max:255',
            'content' => 'required|string',
        ];
    }
}

Controller jadi super bersih:

public function update(UpdatePostRequest $request, Post $post)
{
    // Authorization sudah ditangani di Form Request
    // Validation sudah ditangani di Form Request
    $post->update($request->validated());
    return redirect()->route('posts.show', $post)->with('success', 'Postingan diperbarui.');
}

5. Perbandingan Cara Menggunakan Policy

Cara Lokasi Kapan Digunakan
$this->authorize() Controller Paling umum, fleksibel
@can Blade Kontrol tampilan UI
Middleware can: routes/web.php Proteksi route langsung
Form Request authorize() method Controller butuh sangat bersih

Ringkasan Episode

  • before() dijalankan sebelum method lain — return true untuk bypass, null untuk lanjut
  • Gunakan ?User $user agar Policy mendukung guest/user yang belum login
  • Middleware can: bisa langsung digunakan di route untuk proteksi singkat
  • Form Request adalah tempat terbaik untuk authorization jika controller butuh tetap minimalis

Preview Episode Berikutnya

Di Episode 5 (episode terakhir!), kita akan merangkum semua yang sudah dipelajari dengan membangun mini project: sistem blog sederhana dengan authorization lengkap — dari Gates untuk admin panel, sampai Policies untuk manajemen postingan.

Daftar eBook