- Part 1: Setup & Menampilkan Data
- Part 2: CRUD (Tambah, Edit, Hapus)
- Part 3: Pencarian, Filter & Paginasi
- Part 4: Autentikasi Login (sedang dibaca)
Selamat datang di bagian terakhir seri tutorial CodeIgniter 4. Sepanjang Part 1 hingga Part 3, kita telah membangun aplikasi katalog buku yang lengkap dengan CRUD, pencarian, filter, dan paginasi. Namun ada satu masalah keamanan besar: siapa pun yang membuka URL bisa menambah, mengedit, atau menghapus buku. Di Part 4 ini kita akan membangun sistem autentikasi login untuk menutup celah tersebut.

Bagaimana Autentikasi Bekerja
Alur autentikasi sederhana terdiri dari beberapa tahap: pengguna mengisi form login, sistem memverifikasi username dan password terhadap database, jika cocok status login disimpan di session, lalu sebuah filter memastikan hanya pengguna yang sudah login yang bisa mengakses halaman pengelolaan. Mari kita bangun tahap demi tahap.
Membuat Tabel Pengguna
Buat migration untuk tabel pengguna:
php spark make:migration CreatePengguna
Isi metode up():
public function up()
{
$this->forge->addField([
'id' => [
'type' => 'INT',
'unsigned' => true,
'auto_increment' => true,
],
'nama' => [
'type' => 'VARCHAR',
'constraint' => 80,
],
'username' => [
'type' => 'VARCHAR',
'constraint' => 40,
],
'password' => [
'type' => 'VARCHAR',
'constraint' => 255,
],
]);
$this->forge->addKey('id', true);
$this->forge->addUniqueKey('username');
$this->forge->createTable('pengguna');
}
Perhatikan kolom password memakai panjang 255. Ini penting karena kita tidak menyimpan password apa adanya, melainkan versi ter-hash yang panjangnya bisa mencapai 60 karakter atau lebih.
Membuat Model dan User Awal
Buat model PenggunaModel dengan kolom yang diizinkan:
<?php
namespace App\Models;
use CodeIgniter\Model;
class PenggunaModel extends Model
{
protected $table = 'pengguna';
protected $primaryKey = 'id';
protected $returnType = 'array';
protected $allowedFields = ['nama', 'username', 'password'];
}
Lalu buat seeder untuk menambahkan satu akun admin. Jangan pernah menyimpan password dalam bentuk teks biasa — selalu gunakan password_hash():
public function run()
{
$this->db->table('pengguna')->insert([
'nama' => 'Administrator',
'username' => 'admin',
'password' => password_hash('rahasia123', PASSWORD_DEFAULT),
]);
}
Fungsi password_hash() mengubah “rahasia123” menjadi rangkaian karakter acak yang tidak bisa dibalik. Jalankan migration dan seeder seperti pada Part 1.
Membuat Controller Autentikasi
Buat controller khusus untuk login dan logout:
php spark make:controller Auth
Isi dengan tiga metode: menampilkan form, memproses login, dan logout:
<?php
namespace App\Controllers;
use App\Models\PenggunaModel;
class Auth extends BaseController
{
public function formLogin()
{
return view('auth/login');
}
public function login()
{
$model = new PenggunaModel();
$username = $this->request->getPost('username');
$password = $this->request->getPost('password');
$pengguna = $model->where('username', $username)->first();
if ($pengguna && password_verify($password, $pengguna['password'])) {
session()->set([
'id_pengguna' => $pengguna['id'],
'nama' => $pengguna['nama'],
'login' => true,
]);
return redirect()->to('/buku');
}
return redirect()->back()
->withInput()
->with('error', 'Username atau password salah.');
}
public function logout()
{
session()->destroy();
return redirect()->to('/login')
->with('sukses', 'Anda telah keluar.');
}
}
Fungsi password_verify() membandingkan password yang diketik dengan hash di database — inilah cara aman memeriksa password tanpa pernah menyimpannya secara terbuka.
Membuat Form Login
Buat view app/Views/auth/login.php:
<?= $this->extend('layouts/utama') ?>
<?= $this->section('konten') ?>
<h2>Login Admin</h2>
<?php if (session('error')): ?>
<div class="kotak-error"><?= esc(session('error')) ?></div>
<?php endif ?>
<form action="/login" method="post">
<?= csrf_field() ?>
<label>Username</label>
<input type="text" name="username" value="<?= old('username') ?>">
<label>Password</label>
<input type="password" name="password">
<button type="submit" class="tombol">Login</button>
</form>
<?= $this->endSection() ?>

Melindungi Halaman dengan Filter
Inilah bagian terpenting: mencegah pengguna yang belum login mengakses halaman buku. CodeIgniter 4 menyediakan mekanisme Filter. Buat file app/Filters/AuthFilter.php:
<?php
namespace App\Filters;
use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
class AuthFilter implements FilterInterface
{
public function before(RequestInterface $request, $arguments = null)
{
if (! session()->get('login')) {
return redirect()->to('/login')
->with('error', 'Silakan login terlebih dahulu.');
}
}
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
// tidak dipakai
}
}
Metode before() dijalankan sebelum controller. Jika session login tidak ada, pengguna langsung dialihkan ke halaman login.
Mendaftarkan dan Menerapkan Filter
Daftarkan filter dengan sebuah alias di app/Config/Filters.php:
public array $aliases = [
// ... alias bawaan ...
'auth' => \App\Filters\AuthFilter::class,
];
Lalu terapkan filter itu pada rute yang ingin dilindungi. Buka app/Config/Routes.php dan bungkus rute buku dengan grup ber-filter:
$routes->get('login', 'Auth::formLogin');
$routes->post('login', 'Auth::login');
$routes->get('logout', 'Auth::logout');
$routes->group('buku', ['filter' => 'auth'], function ($routes) {
$routes->get('', 'Buku::index');
$routes->get('tambah', 'Buku::tambah');
$routes->post('simpan', 'Buku::simpan');
$routes->get('edit/(:num)', 'Buku::edit/$1');
$routes->post('update/(:num)', 'Buku::update/$1');
$routes->get('hapus/(:num)', 'Buku::hapus/$1');
});
Sekarang, seluruh URL yang diawali /buku hanya bisa diakses setelah login. Mencoba membukanya tanpa login akan otomatis dilempar ke halaman login.

Menampilkan Nama Admin dan Tombol Logout
Agar pengalaman lebih lengkap, tampilkan nama admin yang sedang login beserta tombol logout di layout app/Views/layouts/utama.php. Manfaatkan helper session():
<nav>
<a href="/buku">Daftar Buku</a>
<?php if (session('login')): ?>
<span>Halo, <?= esc(session('nama')) ?></span>
<a href="/logout">Logout</a>
<?php endif ?>
</nav>
Menguji Alur Login
Cobalah alur berikut untuk memastikan semuanya bekerja:
- Buka
/bukutanpa login → Anda dialihkan ke/login. - Masukkan username
admindan passwordrahasia123→ berhasil masuk ke daftar buku. - Coba password salah → muncul pesan “Username atau password salah.”
- Klik Logout → session dihapus dan Anda kembali ke halaman login.
Catatan Keamanan Penting
- Selalu hash password dengan
password_hash()— jangan pernah menyimpan teks asli. - Aktifkan CSRF protection pada seluruh form (sudah otomatis lewat
csrf_field()). - Untuk aplikasi produksi yang lebih besar, pertimbangkan library resmi seperti CodeIgniter Shield yang menyediakan autentikasi lengkap termasuk peran (role), verifikasi email, dan rate limiting.
Penutup Seri
Selamat! Anda telah menyelesaikan seri lengkap membangun aplikasi CodeIgniter 4 dari nol — mulai dari instalasi dan menampilkan data (Part 1), CRUD (Part 2), pencarian dan paginasi (Part 3), hingga autentikasi login (Part 4). Kini Anda memiliki fondasi kokoh untuk membangun aplikasi web nyata dengan CodeIgniter 4.
Langkah selanjutnya bisa Anda eksplorasi sendiri: menambahkan peran admin dan member, mengunggah sampul buku, membuat dashboard statistik, atau membangun REST API. Semua itu dibangun di atas konsep-konsep yang sudah Anda kuasai di seri ini. Selamat berkarya dan teruslah belajar!
Referensi: untuk pendalaman lebih lanjut, kunjungi dokumentasi resmi CodeIgniter 4.

