Cara Membuat Autentikasi Login di CodeIgniter 4 (Part 4)

📚 Seri Tutorial CodeIgniter 4

  1. Part 1: Setup & Menampilkan Data
  2. Part 2: CRUD (Tambah, Edit, Hapus)
  3. Part 3: Pencarian, Filter & Paginasi
  4. 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.

Alur Autentikasi Login
Alur Autentikasi Login

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() ?>
Form login admin
Form login admin

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.

Form login dengan pesan error
Form login dengan pesan error

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 /buku tanpa login → Anda dialihkan ke /login.
  • Masukkan username admin dan password rahasia123 → 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.

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *