intermediateCoding & Development
Awcms Abac Guard
Terapkan kontrol akses RBAC+ABAC default-deny plus RLS pada endpoint/service AWCMS. Gunakan pada setiap endpoint non-public dan setiap akses data tenant-scoped. Menegakkan default deny, deny-overrides-allow, decision log, dan tenant isolation sesuai doc 03 & 10.
69OpxScoreProvisional
Community resultNot enough feedback0 votes
Model evidenceNo verified tests
Claude
Score breakdown
Estimated from the available content and source signals.
Documentation77
Practical value68
Evidence52
Source trust72
Model compatibility
Inferred fit is not the same as a recorded hands-on test.
ClaudeinferredThe skill text mentions Claude or a closely associated term.
ChatGPTuntestedNo model-specific signal or recorded compatibility test was found.
GeminiuntestedNo model-specific signal or recorded compatibility test was found.
CopilotuntestedNo model-specific signal or recorded compatibility test was found.
LlamauntestedNo model-specific signal or recorded compatibility test was found.
PerplexityuntestedNo model-specific signal or recorded compatibility test was found.
MistraluntestedNo model-specific signal or recorded compatibility test was found.
GrokuntestedNo model-specific signal or recorded compatibility test was found.
Overview
AWCMS — ABAC Guard & Tenant Isolation
Ikuti docs/awcms/03_srs_detail_per_modul.md, docs/awcms/10_template_kode_coding_standard.md, dan docs/awcms/17_default_seed_rbac_abac.md (matriks role→permission & default ABAC policy). Mekanisme RLS/tenant context konkret: docs/awcms/16_backend_data_access_integration.md.
Prinsip
- Default deny — tidak ada policy yang mengizinkan = tolak.
- Deny overrides allow — satu deny mengalahkan semua allow.
- RLS tetap wajib walau ABAC sudah cek (defense in depth).
- Akses ditolak yang high-risk → catat di decision log.
- UI hiding bukan kontrol utama; backend tetap validasi.
- Archive/restore/purge soft delete default deny sampai permission eksplisit tersedia.
Bentuk request/decision
type AccessRequest = {
moduleKey: string;
activityCode: string;
action:
| "read"
| "create"
| "update"
| "delete"
| "post"
| "cancel"
| "approve"
| "export"
| "send"
| "configure"
| "analyze"
| "assign"
| "restore"
| "purge"
| "retry"
| "sync"
| "enable"
| "disable"
| "check"
| "publish"
| "schedule"
| "archive"
| "verify"
| "set_primary" // Issue #562 (tenant_domain) — see access-control.ts's own comment for why neither is in HIGH_RISK_ACTIONS
| "connect"
| "disconnect" // Issue #643 (social_publishing) — unlike verify/set_primary, BOTH are in HIGH_RISK_ACTIONS (write a credential-bearing token_reference)
| "preview" // Issue #641 (blog_content) — read-only (internal-links preview), not in HIGH_RISK_ACTIONS
// Platform-evolution epic #738 additions (identity-access/domain/access-control.ts:73-188):
| "release" // #745 data_lifecycle: legal_hold.release — HIGH_RISK
| "replay" // #742 domain_event_runtime: deliveries.replay — not high-risk (idempotent by event ID)
| "manage" // #742 domain_event_runtime: consumers.manage (pause/resume) — not high-risk
| "revoke" // #746 identity-access: business-scope/SoD-exception revoke — HIGH_RISK
| "override" // #746 identity-access: reserved for future conflict-override hook — HIGH_RISK
| "reject" // #746 identity-access: reject a SoD conflict exception request — not high-risk (safe outcome)
| "retire" // #747 workflow_approval: voluntary definition retirement — HIGH_RISK
| "reassign" // #747 workflow_approval: reassign a pending task's open seats — HIGH_RISK
| "force_decide" // #747 workflow_approval: force-approve/reject bypassing quorum — HIGH_RISK
| "merge" // #748 profile_identity: profile_merge.merge (execute approved merge) — HIGH_RISK
| "commit" // #750 reference_data imports.commit / #751 document_infrastructure number-sequence commit — HIGH_RISK
| "rollback" // #750 reference_data: imports.rollback — HIGH_RISK
| "void" // #751 document_infrastructure: irreversible-by-default document void — HIGH_RISK
| "reclassify" // #751 document_infrastructure: change document classification/confidentiality — HIGH_RISK
| "reserve" // #751 document_infrastructure: document number sequence reservation — HIGH_RISK
| "rebuild"; // #753 reporting: trigger/resume a full projection rebuild — HIGH_RISK
resourceType?: string;
resourceId?: string;
resourceAttributes?: Record<string, unknown>;
environmentAttributes?: Record<string, unknown>;
};
type AccessDecision = {
allowed: boolean;
reason: string;
decisionId?: string;
matchedPolicy?: string;
};
Prosedur
flowchart LR
Req[Request] --> Ctx[Tenant context + SET app.current_tenant_id] --> Eval[Evaluate ABAC] --> D{allowed?}
D -- Tidak --> Log[Decision log jika high-risk] --> Deny[403 ACCESS_DENIED]
D -- Ya --> Next[Lanjut ke validasi/service]
Aturan implementasi
- Guard HANYA pada
actionyang DI-SEED diawcms_permissions. Katalog permission disemai lewat migrasisql/*(mis.sql/005untukaccess_control=read/assign/configure,office_management=read/create/update). Owner role di-grant SELURUH barisawcms_permissionssaat bootstrap (platform-bootstrap.tsSELECT id FROM awcms_permissions), dan jalur e2e = migrasi →POST /setup/initializeTANPA module permission-sync di antaranya. Jadi guard padaactionyang tidak ter-seed men-DENY bahkan owner (403) — dan ini LATENT: e2e admin env-gated sering ter-skip di CI kosong → hijau padahal rusak. Sebelum menulis guard baru: pakai action yang sudah ter-seed untuk aktivitas itu (mis. administrasi role/policy →configure, assign role →assign), ATAU tambah action lewat migrasi seed baru (INSERT ... ON CONFLICT DO NOTHING; migrasi terapan immutable — jangan editsql/005). Deklarasi dimodule.tspermissions[]tidak cukup — itu bukan baris katalog DB saat bootstrap (Issue #171). Cocokkan gate UI SSR dengan action guard endpoint yang sama. - Set tenant context di awal transaction:
SET app.current_tenant_id = .... - Query tenant-scoped wajib filter
tenant_id(jangan hanya andalkan RLS). - Role sistem (
is_system) itu invarian: tolak soft-delete, grant/revoke permission, dan assign/unassign role sistem via API (mirrorsoftDeleteRole), dan jangan biarkan admin dinonaktifkan sampai tak ada admin aktif tersisa — jika tidak, holder permission terdelegasi bisa eskalasi/mengunci tenant (Issue #171 review). - Query resource soft-deletable default
deleted_at IS NULL;includeDeleted,restore, danpurgewajib ABAC eksplisit. - Contoh batas peran: operator ditolak akses pajak/export/assign role; cross-tenant selalu blocked.
tenantUserId/identityIdberasal dari auth middleware, bukan header public mentah.- Layar admin write-form memakai
sendJson/postJson/lockElement(src/lib/ui/admin-form-client.ts, skillawcms-ui-screen) untuk memanggil endpoint mutation — pastikan gate/permission yang dicek untuk menampilkan tombol/form itu adalahactionyang SAMA dan SUDAH ter-seed diawcms_permissions(aturan di atas), bukan action yang "kelihatan benar" tapi belum ter-seed — kalau salah, tombolnya tampil tapi request-nya 403 bahkan untuk owner.
Verifikasi (test)
- default deny; deny overrides allow; cashier limit; tax officer access; cross-tenant blocked; archive/restore denied tanpa permission; decision log tercatat.
Best for
- Use Awcms Abac Guard when this documented workflow matches the task.
Tips and best practices
- Review the source instructions and adapt inputs before running the workflow.
What This Skill Can Do
AI-generated examples showing real capabilities
Was this skill useful?
Be the first to share a result.