Menambahkan Fitur Autentikasi User & Hak Akses Berbasis Peran (RBAC) di Yii2

📅 7 Agustus 2026 ☕ 6 min read
Menambahkan Fitur Autentikasi User & Hak Akses Berbasis Peran (RBAC) di Yii2

Menambahkan Fitur Autentikasi User & Hak Akses Berbasis Peran (RBAC) di Yii2

Setelah berhasil membangun fitur pengelolaan data dasar (CRUD), integrasi API eksternal via Guzzle, cetak laporan PDF, hingga Dashboard Analytics interaktif, kebutuhan berikutnya yang sangat krusial dalam aplikasi level enterprise adalah Keamanan Akses (Autentikasi & Otorisasi).

Di dunia nyata, tidak semua orang boleh mengakses atau mengubah data inventaris. Kita perlu membatasi akses aplikasi berdasarkan peran (role):

  • Admin: Memiliki akses penuh ke seluruh fitur (Dashboard, CRUD Produk, Cetak PDF, dan Manajemen User).

  • Staff Gudang: Hanya memiliki akses untuk melihat daftar produk, memperbarui stok, dan mencetak laporan PDF (tidak dapat menghapus produk atau mengelola user).

Pada bagian lanjutan ini, kita akan mengkonfigurasi sistem autentikasi user bawaan Yii2 dan menerapkan Role-Based Access Control (RBAC) menggunakan database.

Susunan Judul Pengembangan Fitur Autentikasi & RBAC

  1. Membuat Tabel User & Mengaktifkan RBAC di Database

  2. Mengonfigurasi Komponen AuthManager di Yii2 (config/web.php)

  3. Membuat Migration RBAC & Inisialisasi Peran (Role Admin & Staff)

  4. Menerapkan Filter Akses (AccessControl) pada Controller

  5. Menyesuaikan Tampilan Navigasi & Uji Coba Hak Akses

1. Membuat Tabel User & Mengaktifkan RBAC di Database

Secara default, Yii2 Basic menyediakan kelas app\models\User yang menggunakan data hardcoded di memori. Untuk aplikasi nyata, kita harus menyimpan data user dan RBAC di database.

Step A: Buat Tabel user di MySQL

Jalankan kueri SQL berikut di database db_inventaris:

SQL

 

CREATE TABLE `user` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `username` VARCHAR(255) NOT NULL UNIQUE,
  `auth_key` VARCHAR(32) NOT NULL,
  `password_hash` VARCHAR(255) NOT NULL,
  `password_reset_token` VARCHAR(255) NULL UNIQUE,
  `email` VARCHAR(255) NOT NULL UNIQUE,
  `status` SMALLINT NOT NULL DEFAULT 10,
  `created_at` INT NOT NULL,
  `updated_at` INT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Step B: Jalankan Migration RBAC Bawaan Yii2

Yii2 sudah menyediakan skema tabel RBAC bawaan. Jalankan perintah terminal berikut untuk membuat tabel-tabel pendukung RBAC (auth_item, auth_assignment, dll.):

Bash

 

php yii migrate/up --migrationPath=@yii/rbac/migrations

2. Mengonfigurasi Komponen AuthManager (config/web.php)

Buka berkas config/web.php dan daftarkan authManager berbasis database (DbManager) serta sesuaikan komponen user:

PHP

 

// config/web.php

'components' => [
    // ... komponen lainnya ...

    'user' => [
        'identityClass' => 'app\models\User', // Menggunakan Model User Database
        'enableAutoLogin' => true,
    ],

    // Aktifkan DbManager untuk RBAC berbasis Database
    'authManager' => [
        'class' => 'yii\rbac\DbManager',
    ],
    
    // ...
],

3. Inisialisasi Peran & Permisi RBAC via Command Console

Kita akan membuat skrip Console Command untuk mendaftarkan peran Admin dan StaffGudang beserta hak aksesnya.

Buat berkas baru RbacController.php di dalam folder commands/:

PHP

 

<?php

namespace app\commands;

use Yii;
use yii\console\Controller;

class RbacController extends Controller
{
    public function actionInit()
    {
        $auth = Yii::$app->authManager;
        $auth->removeAll(); // Bersihkan skema lama

        // 1. Buat Permisi (Permissions)
        $manageProduk = $auth->createPermission('manageProduk');
        $manageProduk->description = 'Mengelola penuh data produk (Create, Update, Delete)';
        $auth->add($manageProduk);

        $viewProduk = $auth->createPermission('viewProduk');
        $viewProduk->description = 'Melihat dan mencetak laporan produk';
        $auth->add($viewProduk);

        // 2. Buat Peran (Roles)
        $staff = $auth->createRole('staff');
        $auth->add($staff);
        $auth->addChild($staff, $viewProduk); // Staff hanya punya akses view

        $admin = $auth->createRole('admin');
        $auth->add($admin);
        $auth->addChild($admin, $manageProduk);
        $auth->addChild($admin, $staff); // Admin mewarisi seluruh izin Staff

        // 3. Assign Peran ke User ID (Asumsi ID 1 = Admin, ID 2 = Staff)
        $auth->assign($admin, 1);
        $auth->assign($staff, 2);

        echo "Berhasil menginisialisasi RBAC Roles & Permissions!\n";
    }
}

Jalankan skrip ini melalui terminal:

Bash

 

php yii rbac/init

4. Menerapkan Filter Akses (AccessControl) pada Controller

Sekarang, mari kita lindungi ProdukController.php menggunakan filter AccessControl dan mengecek hak akses pengguna.

Buka controllers/ProdukController.php dan tambahkan method behaviors():

PHP

 

<?php

namespace app\controllers;

use Yii;
use app\models\Produk;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\AccessControl;
use yii\filters\VerbFilter;

class ProdukController extends Controller
{
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::class,
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
            // MENAMBAHKAN BEHAVIOR HAK AKSES (RBAC)
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        // Izinkan aksi 'index', 'view', dan 'cetak-pdf' untuk role 'staff' & 'admin'
                        'actions' => ['index', 'view', 'cetak-pdf'],
                        'allow' => true,
                        'roles' => ['staff'], 
                    ],
                    [
                        // Izinkan aksi 'create', 'update', dan 'delete' HANYA untuk role 'admin'
                        'actions' => ['create', 'update', 'delete'],
                        'allow' => true,
                        'roles' => ['admin'],
                    ],
                ],
            ],
        ];
    }

    // ... method actionIndex, actionCreate, actionUpdate, dll.
}

5. Menyesuaikan Tampilan Navigasi & Uji Coba

Buka berkas view views/produk/index.php untuk menyembunyikan tombol aksi sensitif bagi pengguna yang tidak memiliki hak akses:

PHP

 

<?php

use yii\helpers\Html;
use yii\grid\GridView;

// ... kode sebelumnya ...
?>

<div class="produk-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <!-- Hanya tampilkan tombol Tambah jika user memiliki hak akses admin -->
        <?php if (Yii::$app->user->can('manageProduk')): ?>
            <?= Html::a('Tambah Produk Baru', ['create'], ['class' => 'btn btn-success']) ?>
        <?php endif; ?>

        <?= Html::a('Cetak Laporan PDF', ['cetak-pdf'], ['class' => 'btn btn-danger', 'target' => '_blank']) ?>
    </p>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'kode_produk',
            'nama_produk',
            'harga_usd',
            'stok',

            [
                'class' => 'yii\grid\ActionColumn',
                // Sembunyikan tombol Edit dan Delete dari tampilan jika user BUKAN Admin
                'visibleButtons' => [
                    'update' => Yii::$app->user->can('manageProduk'),
                    'delete' => Yii::$app->user->can('manageProduk'),
                ]
            ],
        ],
    ]); ?>

</div>

Hasil Uji Coba Pengaturan Hak Akses

  1. Login sebagai Staff (staff):

    • Pengguna dapat membuka halaman Dashboard, melihat Daftar Produk, dan mengklik Cetak Laporan PDF.

    • Tombol Tambah Produk Baru, ikon Edit, dan ikon Hapus tersembunyi secara otomatis.

    • Jika Staff mencoba mengakses alamat http://localhost:8080/index.php?r=produk/create secara manual melalui URL, Yii2 akan secara otomatis menolak akses dan menampilkan pesan 403 Forbidden.

  2. Login sebagai Admin (admin):

    • Pengguna memiliki akses penuh ke seluruh fitur tanpa batasan.

Kesimpulan Akhir Seri Pembuatan Proyek Yii2

Dengan penambahan modul Autentikasi & RBAC, aplikasi Sistem Manajemen Inventaris Produk milik kita kini telah menjadi sebuah aplikasi web modern berskala profesional yang memenuhi seluruh standar industri:

  1. Struktur Arsitektur Rapih (MVC & PSR-4).

  2. Integrasi Dependensi Modern via Composer (Guzzle & mPDF).

  3. Generasi Kode Cepat & Interaktif (Gii Generator).

  4. Keamanan Kelas Tinggi (Autentikasi, RBAC, CSRF, XSS, & SQL Injection Protection).

  5. Penyajian Data Informatif (Dashboard Analytics, Chart.js, & Cetak PDF).


+