Mengimplementasikan fine-grained authorization dengan Authorization Services Keycloak: resources dan scopes, kebijakan berbasis role, group, user, klien, waktu, hingga JavaScript, serta alur evaluasi permission yang menghasilkan RPT.

Di episode 24 kalian mengamankan pintu masuk: brute force protection, security headers, dan keamanan token. Episode 25 ini bergerak lebih dalam — dari siapa yang boleh masuk menjadi apa yang boleh dilakukan setelah masuk. Autentikasi menjawab identitas; authorization menjawab otorisasi. Keycloak menyediakan modul Authorization Services untuk mengatur akses pada tingkat resource, bukan sekadar per role.
Authorization Services diaktifkan per klien lewat tab Authorization di halaman klien. Begitu diaktifkan, Keycloak menjadi policy decision point yang mengevaluasi setiap permintaan akses berdasarkan resource, scope, policy, dan permission yang kalian definisikan.
Pendekatan ini resource-based: keputusan dibuat per resource dengan mempertimbangkan konteks permintaan — siapa yang meminta, dari IP mana, jam berapa, dan data apa yang terlibat. Ini berbeda dari RBAC klasik yang hanya melihat label role user. Dengan context-based decisions, dua user bergolongan sama bisa mendapat keputusan berbeda karena waktu atau lokasinya berbeda.
Beberapa konsep inti yang akan kalian pakai terus:
| Konsep | Peran |
|---|---|
| Resource | objek yang dilindungi, misalnya dokumen, API endpoint, atau file |
| Scope | aksi yang bisa dilakukan terhadap resource: view, edit, delete |
| Policy | aturan logika: role tertentu, user tertentu, waktu tertentu |
| Permission | pengikat antara resource dan policy |
| RPT | token hasil evaluasi, memuat grants untuk resource |
Keycloak menerapkan UMA 2.0 sebagai fondasinya — standar yang memungkinkan pemilik resource mengatur siapa yang boleh mengakses apa, dengan alur permission ticket yang terstruktur.
Langkah pertama adalah memodelkan apa yang dilindungi. Di tab Authorization → Resources, kalian mendefinisikan resource dengan nama, tipe, URI, dan atribut. Scope mendeskripsikan aksi yang bisa dilakukan:
{
"name": "Transaksi",
"type": "urn:bank:transaction",
"uris": ["/transactions/*"],
"scopes": ["view", "edit", "delete"],
"attributes": {
"region": "jakarta"
}
}attributes adalah resource attributes — metadata yang bisa dipakai policy untuk keputusan berbasis konteks. Misalnya atribut region bisa menjadi dasar aturan "hanya bisa diedit dari region yang sama". uris menghubungkan resource dengan endpoint API yang dilindungi, sehingga enforcement bisa dikaitkan langsung ke rute permintaan. Scope juga bisa diatur sebagai scope permission terpisah agar penggunaannya dikendalikan per scope.
Policy adalah logika keputusan. Keycloak menyediakan banyak tipe yang bisa dikombinasikan:
| Tipe Policy | Logika |
|---|---|
| Role-based | mengizinkan pemegang role tertentu |
| User-based | mengizinkan user tertentu |
| Group-based | mengizinkan anggota group tertentu |
| Client-based | mengizinkan klien tertentu |
| Time-based | hanya berlaku pada rentang waktu tertentu |
| JavaScript | logika bebas ditulis dalam JavaScript |
| Aggregated | menggabungkan beberapa policy dengan aturan AND atau OR |
Policy role-based adalah yang paling umum: "role teller boleh view resource Transaksi". Time-based berguna untuk jam kerja: "transfer hanya boleh jam 08.00 sampai 17.00". JavaScript policy memberi fleksibilitas penuh — misalnya membandingkan atribut request dengan atribut resource secara langsung. Aggregated policy menggabungkan semuanya: role teller DAN jam kerja DAN region jakarta. Client-based berguna di skenario service-to-service, saat akses ditentukan oleh identitas aplikasi pemanggil, bukan hanya user.
Permission adalah pengikat antara resource (atau scope) dan satu atau lebih policy. Keycloak mengenal dua bentuk:
{
"name": "Teller boleh view transaksi",
"type": "resource",
"resources": ["Transaksi"],
"scopes": ["view"],
"policies": ["Hanya role teller", "Hanya jam kerja"]
}Evaluasi berlangsung AND antar policy dalam satu permission: kedua policy di atas harus lulus sebelum akses diberikan. Ini bentuk paling umum dari context-based decisions — peran user benar, tetapi jam di luar jam kerja tetap ditolak.
Ketika aplikasi meminta akses, urutannya:
Cara paling umum mendapatkan RPT adalah lewat token endpoint dengan UMA ticket grant:
curl -X POST "https://sso.example.com/realms/bank/protocol/openid-connect/token" \
-H "Authorization: Bearer <access_token>" \
-d "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
-d "client_id=bank-app" \
-d "audience=bank-app" \
--data-urlencode "permission=Transaksi#view"Parameter permission diisi kombinasi resource dan scope yang dipisahkan tanda pagar, misalnya resource Transaksi dengan scope view. urn:ietf:params:oauth:grant-type:uma-ticket adalah grant type khusus yang menandakan "beri saya RPT untuk permission ini". Keycloak juga menyediakan endpoint authorization request (/authz/authorize) dan entitlements endpoint untuk pola lama — menarik seluruh entitlement seorang user terhadap resource server sekaligus — sementara alur modern tetap berjalan lewat token endpoint.
Secara arsitektur, keputusan dan penegakan dipisah:
Untuk melindungi API, PEP dipasang di gateway atau di dalam layanan. Di arsitektur microservices, pola yang dianjurkan: satu PDP pusat, sementara setiap service memasang PEP tipis — keputusan tetap terpusat, penegakan tersebar di banyak titik.
Important
Jangan menempatkan logika keputusan di dalam aplikasi. Aturan harus hidup di Keycloak sebagai PDP agar audit dan perubahan kebijakan terpusat. PEP hanya bertugas menanyakan keputusan dan menegakkannya — bukan memutuskannya.
Episode 25 memperkenalkan fine-grained authorization: Authorization Services per klien dengan konsep resource, scope, policy, dan permission; policy berbasis role, group, user, klien, waktu, JavaScript, dan aggregated; serta alur evaluasi dari authorization request menuju permission ticket dan RPT. Kalian juga memahami pemisahan PEP dan PDP, plus pola penerapan untuk API dan microservices.
Inti yang harus dibawa pulang:
Di episode 26 berikutnya, kalian belajar mengelola klien dalam jumlah besar: client registration & dynamic clients — mendaftarkan aplikasi secara otomatis lewat API, memakai initial access token, dan memilih metode autentikasi klien yang tepat.