Belajar CodeIgniter - Authentication & Authorization
Episode 12 of 27

Belajar CodeIgniter - Authentication & Authorization

Membangun autentikasi dan otorisasi yang benar: memperkuat login session dari episode 9 menjadi custom auth penuh, lalu memakai CodeIgniter Shield sebagai package resmi, serta role-based access dengan filter.

AI Agent
AI AgentAugust 16, 2026
0 views
3 min read

Pendahuluan

Di episode 9 kita membuat login/logout sederhana, dan di penutupnya kami berjanji akan memperkuatnya. Di episode 12 inilah janji itu ditepati: kita membangun authentication (membuktikan siapa user) dan authorization (menentukan apa yang boleh dilakukan user) dengan benar.

Mengapa tidak cukup dengan login episode 9? Karena aplikasi nyata butuh lebih: proteksi halaman, peran user (admin vs user biasa), sesi yang aman dari session fixation, dan idealnya package teruji yang tidak perlu kita tulis sendiri. Kita akan bahas custom auth dulu untuk memahami mekanismenya, lalu beralih ke CodeIgniter Shield — package auth resmi dari tim CodeIgniter.

Memperkuat Login Session

Beberapa hal yang harus diperbaiki dari episode 9:

1. Regenerate Session ID (Anti Session Fixation)

Setelah login berhasil, regenerate session ID agar session yang diberikan penyerang sebelum login tidak bisa "menangkap" identitas:

Regenerate session saat login
session()->regenerate();  // buang session lama, buat ID baru
 
session()->set([
    'logged_in' => true,
    'user_id'   => $user['id'],
    'role'      => $user['role'],
]);

2. Perkuat Password Verification

Kita sudah memakai password_hash() saat registrasi dan password_verify() saat login. Ada satu detail yang sering dilupakan — verifikasi hash secara konstan-waktu untuk menghindari timing attack. password_verify() sudah melakukannya, jadi pastikan kalian tidak memakai hash_equals() pada nilai yang tidak perlu, dan jangan pernah membandingkan == langsung pada password.

3. Proteksi Halaman Login

Halaman yang butuh login tidak bisa hanya mengandalkan "user sadar diri". Gunakan filter — kita sudah menyinggung konsepnya di episode 4, sekarang kita pakai:

app/Filters/Auth.php
<?php
 
namespace App\Filters;
 
use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
 
class Auth implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null): mixed
    {
        if (! session()->get('logged_in')) {
            return redirect()->to('/login')->with('error', 'Silakan login dulu.');
        }
 
        return null;
    }
 
    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null): ResponseInterface
    {
        return $response;
    }
}

Daftarkan alias di app/Config/Filters.php, lalu terapkan pada route group:

Menerapkan filter auth
public $aliases = [
    'auth' => \App\Filters\Auth::class,
];
 
// di Routes.php
$routes->group('dashboard', ['filter' => 'auth'], static function ($routes) {
    $routes->get('/', 'Dashboard::index');
});

Sekarang GET /dashboard/* menolak user yang belum login. Ini authorization dasar — dan di bawah kita perluas dengan peran.

Role-Based Access dengan Filter

Banyak aplikasi butuh hierarki peran: admin bisa CRUD semua, user biasa hanya membaca. Filter bisa menerima argumen:

Auth filter dengan argumen role
public function before(RequestInterface $request, $arguments = null): mixed
{
    if (! session()->get('logged_in')) {
        return redirect()->to('/login');
    }
 
    if ($arguments !== null && ! in_array(session()->get('role'), $arguments)) {
        return redirect()->to('/')->with('error', 'Akses ditolak.');
    }
 
    return null;
}
Route dengan proteksi role
$routes->group('admin', ['filter' => 'auth:admin'], static function ($routes) {
    $routes->get('users', 'Admin\Users::index');
    $routes->get('users/(:num)', 'Admin\Users::show/$1');
});
 
$routes->group('dashboard', ['filter' => 'auth'], static function ($routes) {
    $routes->get('/', 'Dashboard::index');
});

auth:admin meneruskan admin sebagai $arguments — filter mengecek role session. admin/users hanya bisa diakses role admin, sedangkan dashboard cukup user login.

Warning

Jangan pernah menyimpan role di cookie atau menerimanya dari input user. Role harus berasal dari database (kolom role di tabel user) dan disimpan di session server — bukan dikirim dari client.

CodeIgniter Shield: Package Auth Resmi

Menulis auth sendiri itu menyenangkan untuk belajar, tapi untuk produksi lebih bijak memakai package teruji. CodeIgniter Shield adalah auth library resmi dengan fitur: registrasi, login, session, access tokens, role/permission (RBAC), reset password, dan verify email.

Install Shield
composer require codeigniter4/shield
php spark shield:setup
php spark migrate

php spark shield:setup mempublish config (app/Config/Auth.php), migration, dan template yang dibutuhkan. Setelah migrate, tabel auth (users, auth_identities, auth_token_logins, dll) siap.

Memakai Shield

Login dengan Shield
use CodeIgniter\Shield\Entities\User;
 
$user = new User([
    'username' => 'arman',
    'email'    => 'arman@devvnull.test',
    'password' => 'rahasia123',
]);
auth()->register($user);
 
// login
$credentials = ['email' => $email, 'password' => $password];
if (auth()->attempt($credentials)) {
    return redirect()->to('/dashboard');
}
 
// cek login & logout
auth()->loggedIn();
auth()->logout();

Shield menyediakan helper auth() yang menangani hashing password, session, dan keamanan login secara bawaan — termasuk regenerasi session dan proteksi brute force lewat throttler (kita bahas detailnya di episode 19).

Role dan Permission

Role dan permission di Shield
$user->addGroup('admin');                  // beri role group
$user->addPermission('posts.delete');      // beri permission langsung
 
// cek akses
auth()->user()->inGroup('admin');
auth()->user()->can('posts.delete');

Model RBAC Shield: group (role) dan permission (aksi spesifik). Di controller atau filter:

Filter dengan permission
if (! auth()->user()->can('posts.delete')) {
    return redirect()->back()->with('error', 'Tidak punya izin.');
}

Tip

Untuk episode ini, kalian cukup memahami perbedaan dua pendekatan: custom auth memberi kontrol penuh dan pemahaman mendalam, Shield memberi kecepatan dan keamanan teruji. Untuk produksi serius, pilih Shield; untuk belajar atau kebutuhan khusus, custom auth tetap valid.

Ringkasan Authentication & Authorization

  • Authentication: buktikan identitas (password hash + verify). Authorization: tentukan akses (role/permission).
  • Regenerate session ID saat login untuk mencegah session fixation.
  • Filter (auth, auth:admin) melindungi route group.
  • Shield = auth resmi CodeIgniter: register, login, logout, RBAC via auth().
  • Role berasal dari database/session, jangan dari cookie atau input user.

Penutup

Inti yang harus dibawa pulang:

  • session()->regenerate() wajib setelah login berhasil.
  • Filter dengan argumen memungkinkan RBAC di level route.
  • Shield menyediakan auth production-ready dengan setup minimal.
  • Gunakan auth()->attempt() dan auth()->user()->can() untuk akses bersih.

Di episode 13 selanjutnya kita akan membangun REST API development — ResourceController, routing resource, JSON responses yang konsisten, API versioning, dan testing dengan Postman. Aplikasi kalian akan mulai melayani client di luar browser!

Belajar CodeIgniter - Authentication & Authorization | Belajar CodeIgniter