> For the complete documentation index, see [llms.txt](https://learn.devlabss.my.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.devlabss.my.id/laravel/bab-9-autentikasi-and-middleware/9.3-mengunci-halaman-dengan-middleware.md).

# 9.3 Mengunci Halaman dengan Middleware

## Mengunci halaman dengan middleware

Setelah login berhasil dipasang, sekarang saatnya memakai middleware untuk melindungi halaman penting.

Di proyek E-Library, tidak semua halaman harus selalu terbuka.

Fitur seperti daftar buku, tambah data, edit, dan hapus lebih aman jika hanya bisa diakses pengguna yang sudah login.

### Teori awal dan analogi

Bayangkan perpustakaan punya ruangan staf.

Setiap orang boleh melihat gedung perpustakaannya dari luar.

Tetapi tidak semua orang boleh masuk ke ruangan staf.

Di pintu ruangan itu ada pemeriksa akses.

Kalau orang tersebut belum terdaftar, ia tidak boleh masuk.

Middleware `auth` bekerja seperti pemeriksa itu.

Ia mengecek status login sebelum pengguna masuk ke halaman tertentu.

### Target praktik subbab ini

Setelah menyelesaikan subbab ini, Anda seharusnya bisa:

* memahami cara kerja middleware `auth`
* melindungi route buku dengan middleware
* mengetes perbedaan akses antara pengguna login dan belum login
* memahami kenapa pengguna diarahkan ke halaman login

### Langkah praktik step-by-step

Ikuti langkah berikut dengan urut.

{% stepper %}
{% step %}

### Buka file route utama

Buka file:

`routes/web.php`

Di sinilah kita akan menambahkan middleware pada route yang ingin dilindungi.
{% endstep %}

{% step %}

### Kelompokkan route buku dengan middleware `auth`

Ubah route buku Anda menjadi seperti ini:

```php
use App\Http\Controllers\BukuController;
use Illuminate\Support\Facades\Route;

Route::middleware('auth')->group(function () {
    Route::resource('buku', BukuController::class);
});
```

Dengan begitu, semua route CRUD buku akan diperiksa dulu oleh middleware `auth`.
{% endstep %}

{% step %}

### Sisakan halaman umum jika diperlukan

Kalau Anda punya halaman umum seperti halaman welcome, route itu bisa tetap berada di luar middleware.

Contohnya:

```php
Route::get('/', function () {
    return view('welcome');
});
```

Jadi tidak semua halaman harus dikunci.
{% endstep %}

{% step %}

### Uji akses saat belum login

Sebelum mengetes, pastikan server Laravel hidup.

Silakan pilih salah satu:

* buka **Laragon** lalu klik **Start All**
* atau jalankan `php artisan serve`

Setelah itu, pastikan Anda dalam kondisi logout.

Lalu buka:

```
http://127.0.0.1:8000/buku
```

Kalau middleware bekerja, Anda akan diarahkan ke halaman login.
{% endstep %}

{% step %}

### Uji akses saat sudah login

Sekarang login memakai akun yang sudah Anda buat di subbab sebelumnya.

Setelah login berhasil, buka lagi halaman `/buku`.

Kalau berhasil, daftar buku akan tampil normal.
{% endstep %}
{% endstepper %}

### Penjelasan pasca-praktik

Sekarang mari kita bedah bagian yang paling penting.

#### 1. `Route::middleware('auth')->group(...)`

Bagian ini berarti semua route di dalam grup tersebut akan diperiksa oleh middleware `auth`.

Kalau pengguna belum login, request tidak akan diteruskan ke controller.

#### 2. Kenapa pengguna diarahkan ke login

Middleware `auth` mendeteksi bahwa pengguna belum punya status login yang valid.

Karena itu, Laravel mengarahkannya ke halaman login agar proses autentikasi dilakukan dulu.

#### 3. Kenapa route resource cocok digabungkan

Karena satu baris `Route::resource('buku', BukuController::class)` menghasilkan banyak route CRUD sekaligus.

Saat dibungkus middleware `auth`, semuanya otomatis ikut terlindungi.

Itu jauh lebih rapi daripada mengunci satu per satu.

### Alur data teknis

Saat pengguna membuka `/buku`, alurnya seperti ini:

1. browser mengirim request ke route buku
2. middleware `auth` memeriksa status login
3. jika belum login, pengguna diarahkan ke `/login`
4. jika sudah login, request diteruskan ke `BukuController`
5. controller menjalankan logika seperti biasa

### Output yang harus terlihat

Setelah subbab ini selesai, hasil berikut seharusnya sudah terlihat:

* route buku dibungkus dalam middleware `auth`
* saat logout, akses ke `/buku` otomatis diarahkan ke halaman login
* saat sudah login, halaman `/buku` bisa dibuka normal
* akses publik tetap bisa dibiarkan di luar grup middleware

### Contoh halaman yang cocok dikunci

Pada proyek E-Library, halaman yang umumnya cocok dilindungi:

* daftar buku
* form tambah buku
* form edit buku
* proses hapus buku

Sedangkan halaman publik bisa tetap dibiarkan terbuka jika memang diperlukan.

### Troubleshooting yang paling sering

Masalah yang paling sering muncul:

* **halaman buku masih bisa dibuka tanpa login** — route belum dibungkus middleware
* **setelah login tetap mental ke login lagi** — session login bermasalah
* **route jadi error** — penulisan grup middleware salah
* **bingung kenapa semua route ikut terkunci** — lupa bahwa resource route menghasilkan banyak route sekaligus

{% hint style="warning" %}
Kalau Anda membungkus `Route::resource()` dengan middleware `auth`, maka semua route CRUD di dalamnya ikut terkunci, bukan hanya halaman index.
{% endhint %}

{% hint style="info" %}
Cara paling mudah mengetes middleware adalah mencoba akses halaman saat logout, lalu bandingkan hasilnya setelah login.
{% endhint %}

### Poin evaluasi bab 9.3

Pastikan Anda sudah memahami poin berikut:

* Saya bisa menambahkan middleware `auth` pada route buku.
* Saya paham pengguna yang belum login akan diarahkan ke halaman login.
* Saya paham route resource bisa dilindungi sekaligus dalam satu grup.
* Saya bisa membedakan halaman yang perlu dikunci dan halaman yang boleh terbuka.

Jika semuanya sudah jelas, lanjut ke [9.4 Penjelasan Fungsi Auth::user()](/laravel/bab-9-autentikasi-and-middleware/9.4-penjelasan-fungsi-auth-user.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.devlabss.my.id/laravel/bab-9-autentikasi-and-middleware/9.3-mengunci-halaman-dengan-middleware.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
