Bagaimana Saya Memberi Setiap Admin Akses Tepat ke Bagian Organisasinya Sendiri
On this page
- Pendahuluan
- A. Banyak admin, satu kumpulan data
- B. Yang diminta pedoman nasional
- C. Pendekatan yang saya tolak
- D. Lima belas hambatan yang menghalangi
- Metode
- A. Grant adalah satu baris: user, peran, lingkup
- B. Lingkup bersarang, diputuskan di satu tempat
- C. Lingkup unit mengikuti pohon
- D. Kode bertanya tentang izin, tak pernah nama peran
- E. Lingkup data diturunkan
- F. Daftar disaring dengan satu syarat
- G. Beberapa peran, satu jawaban gabungan
- H. Diajukan, lalu disetujui
- I. Pemisahan tugas antarperan
- J. Akses berakhir dengan sendirinya
- K. Akses mengikuti penempatan
- L. Riwayatnya tak pernah dihapus
- M. Super admin darurat berdiri terpisah
- N. Antarmuka membaca izin, server yang memutus
- O. Notifikasi menuju orang yang berlingkup
- Hasil dan Pembahasan
- A. Yang diberikan model ini
- B. Harga yang dibayar
- C. Di mana pendekatan ini cocok
- Simpulan
- Istilah
Pendahuluan
A. Banyak admin, satu kumpulan data
Sistem kepegawaian pemerintah kota dipakai banyak admin, dan hampir tak satu pun boleh melihat semuanya. Kantor kepegawaian pusat mengelola data seluruh pemerintah. Setiap perangkat daerah punya admin sendiri, yang mengelola pegawai perangkat daerah itu dan tak ada yang lain. Perangkat daerah besar melangkah lebih jauh: satu sekolah atau satu puskesmas bisa punya admin sendiri untuk orang-orang yang bekerja di sana. Di samping mereka ada pemeriksa, yang mengecek apa yang diajukan pegawai tentang dirinya — anggota keluarga baru, sertifikat pelatihan, perubahan pangkat — dan pemroses layanan, yang memutus kenaikan gaji berkala, kenaikan pangkat, dan pensiun.
Semuanya bekerja pada data yang sama. Admin perangkat daerah yang membuka daftar pegawai harus melihat pegawai perangkat daerahnya, dan hanya itu. Pemeriksa yang mengecek data keluarga untuk satu perangkat daerah tak boleh bisa menyetujui usulan dari perangkat daerah lain, dan tak boleh bisa menyetujui usulannya sendiri. Karena itu pertanyaan "bolehkah orang ini melakukan ini?" selalu punya paruh kedua: "di bagian organisasi yang mana?"
Tantangannya adalah memberi setiap admin dan pemeriksa akses tepat ke bagian organisasinya sendiri — seluruhnya, satu perangkat daerah, atau satu unit beserta unit di bawahnya — dan membuat pemberian akses itu sendiri terkendali dan tercatat.
Paruh kedua kalimat itu sama pentingnya dengan paruh pertama. Hak akses adalah sasaran tersendiri: siapa pun yang bisa memberi peran bisa memberi dirinya apa saja. Jadi sistem tak cukup menjawab siapa yang boleh menyunting record, tetapi juga siapa yang boleh memberi kemampuan itu kepada orang lain, siapa yang wajib menyetujuinya, berapa lama ia berlaku, dan apa yang terjadi saat orangnya pindah ke perangkat daerah lain.
B. Yang diminta pedoman nasional
Badan kepegawaian nasional telah menerbitkan surat edaran tentang pengelolaan akses ke sistem informasi kepegawaian. Tiga polanya saya jadikan syarat: akses diajukan lalu disetujui, tidak sekadar diberikan; orang yang memverifikasi bukan orang yang menyetujui; dan akses diberikan untuk masa terbatas, paling lama dua tahun, lalu wajib diperpanjang. Pola-pola ini juga lazim dalam praktik keamanan umum — pemisahan tugas dan hak istimewa yang dibatasi waktu muncul di setiap kerangka kendali akses — tetapi karena sudah tertulis oleh regulator, tak ada lagi perdebatan apakah langkah tambahannya sepadan. Surat edaran itu juga membentuk kosakata sistemnya: pengajuan, verifikasi, persetujuan, dan kedaluwarsa menjadi status satu grant yang tercatat, bukan langkah dalam proses informal yang hanya diingat orang.
C. Pendekatan yang saya tolak
Pendekatan paling sederhana adalah peran biasa: peran "Admin Perangkat Daerah" dan pemeriksaan apakah user memilikinya. Ia menjawab "apa", tetapi tidak "di mana". Admin perangkat daerah akan melihat pegawai semua perangkat daerah kecuali setiap query menambahkan syaratnya sendiri, dan syarat itu akan tersebar di puluhan tempat, masing-masing peluang untuk terlupa.
Pendekatan berikutnya adalah satu peran per perangkat daerah: "Admin Dinas Kesehatan", "Admin Dinas Pendidikan", dan seterusnya. Lingkupnya dimasukkan ke nama peran. Saya menolaknya karena jumlah peran berlipat dengan setiap perangkat daerah dan setiap unit, lingkupnya tak bisa dibaca kode tanpa mengurai nama, dan perangkat daerah yang direorganisasi meninggalkan jejak peran yang dinamai menurut unit yang sudah tak ada.
Library peran yang saya pakai menawarkan fitur "teams" yang menempelkan peran ke satu tim. Itulah pilihan siap pakai yang paling dekat, dan saya menolaknya juga: ia mengandaikan satu tim per request, tak mengenal lingkup yang memuat lingkup lain, dan tak punya tempat untuk mencatat siapa yang mengajukan peran, siapa yang menyetujuinya, dan kapan ia berakhir.
Pendekatan yang saya pilih memperlakukan lingkup sebagai data. Pemberian akses adalah satu baris: user ini, peran ini, pada lingkup ini. Kode bertanya tentang izin, tak pernah tentang nama peran, dan setiap pemeriksaan izin dilakukan terhadap lingkup data yang disentuh.
D. Lima belas hambatan yang menghalangi
Gampang dirumuskan, canggung dibangun. Ada lima belas hal di antara "peran dan izin" dan akses yang pas dengan organisasinya.
Pertama, peran saja menyebut apa, bukan di mana. Peran yang dinamai menurut perangkat daerah dan fitur tim tanpa hirarki saya tolak.
Kedua, lingkupnya bersarang. Menulis aturan terpisah untuk setiap pasangan grant dan target saya tolak.
Ketiga, lingkup unit harus mengikuti pohon organisasi. Memberi akses ke daftar unit satu per satu saya tolak, karena unit yang ditambahkan belakangan akan terlewat.
Keempat, nama peran harus dijauhkan dari kode. Pemeriksaan seperti "apakah user ini admin perangkat daerah?" saya tolak.
Kelima, lingkup data yang disentuh harus diketahui. Menyimpan perangkat daerah pemilik di setiap record saya tolak.
Keenam, daftar harus disaring, bukan hanya aksi tunggal. Memeriksa setiap baris sesudah seluruh tabel dimuat saya tolak.
Ketujuh, satu orang bisa memegang beberapa peran berlingkup. Membatasi satu peran per user saya tolak.
Kedelapan, akses harus diajukan lalu disetujui. Membiarkan admin memberikan peran secara langsung saya tolak.
Kesembilan, pemisahan tugas antarperan. Membiarkan orang yang menyetujui akses ikut mengerjakan data kepegawaian saya tolak.
Kesepuluh, akses harus berakhir dengan sendirinya. Akses yang bertahan sampai ada yang ingat mencabutnya saya tolak.
Kesebelas, akses harus mengikuti penempatan orangnya. Mempertahankan peran perangkat daerah sesudah pemegangnya pindah ke perangkat daerah lain saya tolak.
Kedua belas, riwayat akses harus bertahan. Menghapus penugasan peran saat ia berakhir saya tolak.
Ketiga belas, super admin darurat. Super admin yang juga mengerjakan pekerjaan harian saya tolak.
Keempat belas, antarmuka harus tahu apa yang ditampilkan. Memutuskan tampilan dari nama peran di browser saya tolak.
Kelima belas, notifikasi harus sampai ke orang yang tepat. Memberi tahu semua pemegang peran pemeriksa saya tolak.
Urutannya bergerak dari model ke luar. Tujuh yang pertama menetapkan apa itu grant dan bagaimana ia diperiksa; kedelapan sampai ketiga belas mengatur cara grant diberikan, diakhiri, dan dicatat; dua terakhir membawa hasilnya ke antarmuka dan notifikasi. Model yang tak bisa menyebut "di mana" membuat setiap kendali sesudahnya tak bermakna, karena itulah ia datang pertama.
Metode
A. Grant adalah satu baris: user, peran, lingkup
Inilah jawaban atas hambatan pertama: akses ke data kepegawaian tak pernah berupa peran telanjang. Akses itu adalah penugasan — satu baris yang menyebut user, peran, dan lingkup tempat peran itu berlaku, lengkap dengan statusnya, masa berlakunya, dan orang-orang yang mengajukan, menyetujui, atau mencabutnya.
(
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id),
role TEXT NOT NULL, -- key in the role catalogue
scope TEXT NOT NULL, -- operator | agency | unit
agency_id BIGINT REFERENCES agency(id),
unit_id BIGINT REFERENCES org_unit(id),
valid_until TIMESTAMP,
status_id BIGINT NOT NULL REFERENCES assignment_status(id)
);Karena lingkupnya berupa kolom, kode bisa membacanya, meng-query-nya, dan membandingkannya, dan menambah perangkat daerah baru tak butuh peran baru.
B. Lingkup bersarang, diputuskan di satu tempat
Lingkup membentuk rantai. Lingkup sistem menjangkau semuanya. Lingkup operator — kantor kepegawaian pusat — menjangkau setiap perangkat daerah. Lingkup perangkat daerah menjangkau satu perangkat daerah dan setiap unit di dalamnya. Lingkup unit menjangkau satu unit dan unit-unit di bawahnya. Apakah satu grant menjangkau sepotong data diputuskan oleh satu fungsi kecil, dan setiap pemeriksaan di sistem lewat fungsi itu.
C. Lingkup unit mengikuti pohon
Grant unit menyebut satu node pohon organisasi, dan jangkauannya adalah node itu beserta semua keturunannya, dihitung saat grant dimuat. Admin sekolah karenanya langsung menjangkau kelas atau sub-unit baru begitu ditambahkan, tanpa mengubah grant-nya. Saat perangkat daerah mengadopsi versi susunan baru, jangkar grant dipindah ke node yang meneruskan node lama, sehingga reorganisasi tak diam-diam mencabut akses siapa pun atau membiarkannya menunjuk unit yang sudah tak ada.
D. Kode bertanya tentang izin, tak pernah nama peran
Izin dinamai domain.aksi — family.view, family.review, rank.manage — dan peran didefinisikan di katalog sebagai paket izin beserta lingkup yang boleh dipakai untuknya. Kode aplikasi hanya pernah bertanya apakah user punya izin untuk satu target. Peran baru, misalnya pemeriksa data pelatihan, cukup satu entri katalog baru dan tak butuh perubahan pada kode yang memeriksa akses.
Gate milik framework meneruskan setiap nama izin di katalog ke service otorisasi saya, yang mengumpulkan grant user untuk izin itu dan menanyai masing-masing apakah ia menjangkau targetnya.
E. Lingkup data diturunkan
Record tak membawa perangkat daerah pemiliknya sendiri. Lingkup sepotong data diturunkan dari orang-orang yang dibicarakannya. Lingkup pegawai adalah unitnya, atau perangkat daerahnya bila ia belum ditempatkan di unit. Anggota keluarga yang bukan pegawai masuk lingkup pegawai yang berhubungan dengannya — pasangan, orang tua, atau anak. Record pernikahan masuk lingkup salah satu pasangan. Orang yang tak terhubung ke pegawai mana pun hanya terjangkau dari kantor pusat.
Menurunkan lingkup berarti lingkupnya tak mungkin basi. Saat pegawai pindah ke perangkat daerah lain, record keluarganya ikut pindah, karena tak ada yang perlu diperbarui pada record-record itu.
F. Daftar disaring dengan satu syarat
Aksi tunggal diperiksa terhadap satu target, tetapi daftar harus disaring sebelum dimuat. Semua lingkup user untuk satu izin digabung menjadi satu jangkauan: semuanya, atau sekumpulan perangkat daerah dan sekumpulan unit. Jangkauan itu menjadi satu syarat pada query.
Jangkauan kosong menghasilkan syarat yang tak cocok dengan apa pun, sehingga user yang grant-nya tak menjangkau ke mana pun melihat daftar kosong, dan tak ada yang melihat daftar yang baru disaring belakangan.
G. Beberapa peran, satu jawaban gabungan
Satu orang bisa memegang beberapa penugasan: admin perangkat daerah yang sekaligus pemeriksa keluarga untuk satu sekolah, misalnya. Grant-grant-nya disimpan berdampingan, masing-masing dengan izin dan lingkupnya sendiri. Izin diberikan untuk satu target bila ada grant pembawa izin itu yang menjangkaunya, dan daftar disaring dengan gabungan lingkup grant-grant tersebut. Tak ada yang perlu dilebur menjadi satu peran.
H. Diajukan, lalu disetujui
Mengikuti pedoman nasional, tak ada yang memberikan peran secara langsung. Admin yang berhak mengajukan peran pada satu lingkup mengirim pengajuan beserta alasannya. Orang lain yang menyetujui atau menolaknya. Pengaju tak boleh mengajukan peran untuk dirinya sendiri, dan baik pengaju maupun penerima tak boleh memutus pengajuan itu. Saat disetujui, syarat-syaratnya dicek ulang — akun dan penempatan penerima bisa sudah berubah sejak diajukan — dan penyetuju mengonfirmasi dengan password-nya.
I. Pemisahan tugas antarperan
Peran yang menyetujui akses, pengelola akun, tak punya izin apa pun atas data kepegawaian, dan pemegangnya tak bisa diberi peran kepegawaian, begitu pula sebaliknya. Jadi yang mengendalikan akses tak bisa memakainya pada data, dan yang mengerjakan data tak bisa menyetujui aksesnya sendiri. Prinsip yang sama berlaku pada pemeriksaan: pemeriksa tak boleh memutus usulan tentang dirinya sendiri, atau tentang pasangan, orang tua, atau anaknya.
J. Akses berakhir dengan sendirinya
Setiap penugasan punya tanggal berakhir, dua tahun secara bawaan dan tak pernah lebih. Tugas harian menandai penugasan yang kedaluwarsa, dan sejak saat itu ia tak memberi apa-apa lagi. Perpanjangan adalah pengajuan baru yang menunjuk penugasan yang diperpanjangnya, disetujui dengan cara yang sama, sehingga akses yang berlanjut adalah keputusan yang diambil ulang oleh seseorang, bukan bawaan yang tak pernah ditinjau.
K. Akses mengikuti penempatan
Peran pada lingkup perangkat daerah atau unit hanya bisa diberikan kepada orang yang akunnya aktif, tertaut ke data pegawai, dan ditempatkan di perangkat daerah itu. Saat pemegangnya pindah ke perangkat daerah lain, penugasan yang lingkupnya tak lagi cocok dicabut otomatis. Saat akun dilepas dari data pegawainya, semua penugasannya dicabut. Setiap pencabutan otomatis mencatat alasannya.
L. Riwayatnya tak pernah dihapus
Satu baris penugasan adalah satu siklus hidup: diajukan, lalu aktif, ditolak, atau dibatalkan; dan bila aktif, kelak dicabut atau kedaluwarsa. Baris tak pernah dihapus, jadi sistem selalu bisa menjawab siapa memegang akses apa, pada lingkup mana, siapa yang menyetujuinya, dan kapan ia berakhir. Supaya tak ada dua salinan hidup dari grant yang sama, setiap penugasan aktif membawa kunci yang diturunkan dari user, peran, dan lingkupnya, dan kunci itu unik.
Index unik pada kolom itu membuat database menolak duplikat sekalipun dua pengajuan disetujui pada saat yang sama, sementara penugasan yang sudah berakhir, yang kuncinya kosong, tak pernah bertabrakan.
M. Super admin darurat berdiri terpisah
Peran sistem dipisahkan dari peran kepegawaian. Peran administrator memegang semua izin dan ada untuk keadaan darurat, bukan pekerjaan harian. Peran kepegawaian tak pernah berupa peran sistem, sehingga tak mungkin terbagikan tanpa lingkup karena keliru. Bila peran harus diberikan di luar alur ajukan-dan-setujui — untuk menyiapkan penyetuju pertama, misalnya — itu dilakukan lewat perintah command-line yang mewajibkan alasan tertulis dan menghasilkan baris penugasan biasa beserta riwayatnya.
N. Antarmuka membaca izin, server yang memutus
Saat user login, API mengembalikan izinnya beserta lingkup ringkas untuk masing-masing: all, atau daftar perangkat daerah dan unit yang dijangkaunya. Antarmuka memakainya untuk menentukan menu dan tombol yang ditampilkan. Ia tak pernah melihat nama peran.
export const can = (user: AuthenticatedUser | null, permission: string): boolean =>
user !== null && permission in user.permissions
export const canForAgency = (user: AuthenticatedUser | null, permission: string, agencyId: number): boolean => {
const scope = user?.permissions[permission] ?? null
return scope === 'all' || (scope?.agency ?? []).includes(agencyId)
}Menyembunyikan tombol adalah kemudahan, bukan kendali. Setiap request diperiksa ulang di server, dan request di luar lingkup user ditolak di sana, apa pun yang tadinya ditampilkan antarmuka.
O. Notifikasi menuju orang yang berlingkup
Saat pegawai mengajukan perubahan, yang diberi tahu adalah pemegang izin untuk memeriksanya yang lingkupnya menjangkau pegawai itu. Pemeriksa keluarga untuk satu sekolah mendengar usulan dari sekolah itu, dan bukan dari seluruh kota. Notifikasi memakai grant yang sama dan aturan jangkauan yang sama dengan setiap pemeriksaan akses.
Hasil dan Pembahasan
A. Yang diberikan model ini
Setiap pertanyaan tentang akses punya bentuk yang sama: satu izin, satu target, dan grant-grant milik user. Aksi tunggal, daftar yang disaring, menu antarmuka, dan arah notifikasi semuanya memakai satu aturan jangkauan. Perangkat daerah atau unit baru tak butuh peran baru; jenis pemeriksa baru cukup satu entri katalog; dan reorganisasi memindahkan grant bersama susunannya, tidak merusaknya.
Siklus hidupnya memberi paruh kedua tantangan. Akses diajukan beserta alasan, disetujui orang lain, dibatasi waktunya, dicabut saat pemegangnya pindah, dan disimpan dalam riwayat yang tak pernah dihapus.
B. Harga yang dibayar
Model ini menuntut lebih dari admin ketimbang mencentang peran pada user. Setiap grant butuh pengajuan, alasan, dan persetujuan, dan harus diperpanjang. Menurunkan lingkup data juga berarti sebagian pemeriksaan melihat record terkait — lingkup anggota keluarga datang dari pegawai yang tertaut dengannya — dan itu memakan query yang tak diperlukan bila ada kolom pemilik tersimpan. Keduanya saya terima: yang pertama adalah kendali yang diminta pedoman, dan yang kedua menjaga lingkup tetap benar saat orang berpindah.
C. Di mana pendekatan ini cocok
Pendekatan ini cocok untuk sistem apa pun tempat jenis user yang sama bekerja di bagian berbeda dari organisasi yang hirarkis: cabang bank, sekolah di satu wilayah, departemen di rumah sakit. Untuk sistem kecil dengan segelintir user ia berlebihan; di sana beberapa peran biasa sudah cukup, dan siklus ajukan-dan-setujui hanya akan menjadi upacara.
Simpulan
Akses di sistem ini adalah kumpulan baris, masing-masing menyebut siapa, peran apa, dan di mana. Lingkup bersarang dari seluruh sistem sampai satu unit beserta keturunannya, satu fungsi memutuskan apakah grant menjangkau target, kode hanya bertanya tentang izin, dan daftar disaring dengan gabungan lingkup user. Grant diajukan dan disetujui oleh orang yang berbeda, dipisahkan dari peran yang menyetujuinya, dibatasi dua tahun, dicabut saat pemegangnya pindah, dan tak pernah dihapus.
Hasilnya, setiap admin bekerja tepat pada bagian organisasinya sendiri, dan pertanyaan tentang bagaimana ia mendapat akses itu selalu punya jawaban yang tercatat.
Istilah
- Lingkup
- Bagian organisasi tempat grant berlaku: seluruh sistem, semua perangkat daerah, satu perangkat daerah, atau satu unit beserta unit di bawahnya.
- Penugasan
- Satu baris yang memberi satu peran kepada satu user pada satu lingkup, lengkap dengan masa berlaku dan riwayat pengajuan serta persetujuannya.
- Izin
- Aksi bernama atas satu jenis data, misalnya memeriksa data keluarga; peran adalah paket izin.
- Pemisahan tugas
- Aturan bahwa tak ada satu orang yang sekaligus mengendalikan satu aksi dan memeriksanya, misalnya memberi akses dan memakainya.
- Perangkat daerah
- Dinas atau badan pemerintah kota yang punya pegawai dan admin sendiri.
Technologies covered
- PHP
- TypeScript
- Laravel
- Vue