For the complete documentation index, see llms.txt. This page is also available as Markdown.

Role Based Access Controller

Setelah memiliki autentikasi (siapa pengguna), langkah selanjutnya adalah otorisasi (apa yang boleh dilakukan pengguna). RBAC adalah pendekatan standar untuk mengelola hak akses berdasarkan peran (role) yang dimiliki pengguna.

📂 Kode Lengkap Bab Ini: Seluruh kode yang dibahas di bab ini tersedia di GitHub:

🔗 github.com/jacky-htg/workshop/tree/main/18-rbac

18.1 Konsep RBAC

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│    Users     │────▶│    Roles     │────▶│   Accesses   │
└──────────────┘     └──────────────┘     └──────────────┘
   (siapa)              (peran)              (apa yang
                                             boleh dilakukan)
Komponen
Deskripsi
Contoh

User

Pengguna sistem

admin@example.com

Role

Kumpulan akses

superadmin, manager, staff

Access

Ijin spesifik

users::create, users::delete

Prinsip: User memiliki Roles, Roles memiliki Accesses. Seorang user bisa memiliki multiple roles. Dam satu role bisa memiliki banyak akses.

18.2 Design

Database

  • Gambarkan ERD

Cardinality :

  • users : roles → Many-to-Many (via roles_users)

  • roles : access → Many-to-Many (via access_roles)

  • access : access → One-to-Many (self, untuk hierarki)

REST API

  • GET /access

  • GET /roles

  • GET /roles/{id}

  • POST /roles

  • PUT /roles/{id}

  • DELETE /roles/{id}

  • POST /roles/{id}/access/{access_id}

  • DELETE /roles/{id}/access/{access_id}

  • GET /users

  • POST /users

  • GET /users/{id}

  • PUT /users/{id}

  • DELETE /users/{id}

  • POST /login

CLI

Menambahkan routing cli scan-access, untuk menambahkan accesss setiap kali ada pembuatan routing baru.

Handler

Service

Repository

Middleware

Middleware Auth diberi kemampuan untuk melakukan otorisasi berdasarkan role-role yang dimiliki oleh user.

18.3 Implementasi Database

ERD

Migration Tabel

Buat file migration/1_0002_rbac.sql

Seed Data Awal

Buat file migration/3_0002_rbac.sql

18.4 Implementasi Model

18.5 Implementasi DTO (Reques/Response)

Login Response (diperluas)

Access Response (Tree Structure)

Role Request & Response

Users Request & Response (dengan Roles)

18.6 Implementasi Repository

Access Repository

Perhatikan untuk query create, tampak kompleks karena desain operasi insert hanya melalui scan file routing, sehingga jika ada duplikat data akan diabaikan, serta selalu mengembalikan id untuk keperluan mendapatkan id jika access tersebut adalah access parent.

Role Repository

Pada FindByID query termasuk mendapatkan relasi access

User Repository (dengan Roles)

18.7 Implementasi Service

Access Service

Catatan: Fungsi ScanAccess akan dipanggil dari routing cli

Auths Service (diperluas)

Role Service

User Service

18.8 Implementasi Handler

Accesss Handler

Auth Handler

Role Handler

User Handler

18.9 Route Definition untuk Scan Access

Karena kita perlu mendaftarkan semua route ke database untuk keperluan otorisasi, buat struct untuk mendefinisikan route:

18.10 Router dengan Route Definitions

Perhatikan ada fungsi baru: wrapWithRoutePattern, sebelum masuk ke middleware, kita sisipkan informasi terkait pattern dan group ke dalam context value.

18.11 CLI untuk Scan Access

Tambahkan command scan-access untuk mendaftarkan semua route ke database:

Penggunaan:

18.12 Middleware Auth dengan Otorisasi

Middleware sekarang memeriksa apakah user memiliki permission untuk mengakses route:

18.13 REST API Endpoints yang Tersedia

Method
Endpoint
Deskripsi

GET

/accesses

List semua access (tree structure)

GET

/roles

List semua role

POST

/roles

Buat role baru

GET

/roles/{id}

Detail role (dengan accesses)

PUT

/roles/{id}

Update role

DELETE

/roles/{id}

Hapus role

POST

/roles/{id}/access/{access_id}

Grant access ke role

DELETE

/roles/{id}/access/{access_id}

Revoke access dari role

GET

/users

List semua user

POST

/users

Buat user baru (dengan roles)

GET

/users/{id}

Detail user (dengan roles)

PUT

/users/{id}

Update user (dengan roles)

DELETE

/users/{id}

Hapus user

POST

/login

Mendapatakn token dan permissions

18.14 Testing RBAC

Login sebagai Admin

Response

List Roles (dengan token)

Response

Akses tanpa permission (Forbidden)

Ringkasan Bab 18

Di bab ini kita telah belajar:

Komponen
File
Fungsi

Database

migration/*_rbac.sql

Tabel access, roles, relasi many-to-many

Model

model/access.go, role.go, user.go

Struct dengan relasi

Repository

access_repository.go, role_repository.go, user_repository.go

Query dengan JSON aggregation

Service

accesses.go, roles.go, auths.go

Logika bisnis, permission checking dan handling database transaction

Handler

access_handler.go, role_handler.go

HTTP handlers

Middleware

auth_middleware.go

JWT + Permission check

CLI

cli.go (scan-access)

Auto-register routes ke database

Manfaat yang kita peroleh:

  • ✅ Otorisasi berbasis peran (Role-Based Access Control)

  • ✅ Akses hierarkis (root → group → endpoint)

  • ✅ Auto-scan routing untuk registrasi access

  • ✅ Permission checking di middleware

  • ✅ Login response mencakup user info dan permissions

Yang akan datang:

  • Saat ini list users belum mendukung pagination

  • Bab selanjutnya: Pagination – membatasi jumlah data per response

Last updated