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
-
Membuat Tabel User & Mengaktifkan RBAC di Database
-
Mengonfigurasi Komponen AuthManager di Yii2 (
config/web.php) -
Membuat Migration RBAC & Inisialisasi Peran (Role Admin & Staff)
-
Menerapkan Filter Akses (
AccessControl) pada Controller -
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
-
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/createsecara manual melalui URL, Yii2 akan secara otomatis menolak akses dan menampilkan pesan 403 Forbidden.
-
-
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:
-
Struktur Arsitektur Rapih (MVC & PSR-4).
-
Integrasi Dependensi Modern via Composer (
Guzzle&mPDF). -
Generasi Kode Cepat & Interaktif (Gii Generator).
-
Keamanan Kelas Tinggi (Autentikasi, RBAC, CSRF, XSS, & SQL Injection Protection).
-
Penyajian Data Informatif (Dashboard Analytics, Chart.js, & Cetak PDF).




