Casbin
Repositori Resmi: casbin/casbin: An authorization library that supports access control models like ACL, RBAC, ABAC in Golang (github.com)
Dokumentasi Resmi: Overview | Casbin
TIP
Artikel ini hanya bisa dianggap sebagai artikel pengenalan Casbin jika ingin memahami lebih detail silakan kunjungi situs resmi untuk belajar.
Pengenalan
Dalam sebuah sistem programmer backend bertanggung jawab untuk manajemen izin API dan ini memerlukan banyak pekerjaan jika setiap proyek harus ditulis sendiri akan membuang banyak waktu. Perusahaan besar yang memiliki lebih banyak sumber daya cenderung mengembangkan framework izin mereka sendiri tetapi sebagian besar perusahaan kecil dan menengah tidak mampu menanggung biaya pengembangan ini sehingga framework izin open source di pasaran menjadi pilihan utama mereka. Casbin adalah library kontrol akses open source yang efisien dikembangkan menggunakan bahasa Go dan juga mendukung bahasa mainstream lainnya.
Perlu dicatat Casbin hanyalah framework kontrol akses hanya bertanggung jawab untuk kontrol akses logika autentikasi akses tidak menjadi tanggung jawab Casbin Casbin hanya menyimpan hubungan pemetaan antara pengguna dan peran. Mendukung model kontrol akses berikut:
- ACL (Access Control List Daftar Kontrol Akses)
- ACL dengan Superuser
- ACL tanpa Pengguna: Sangat berguna untuk sistem tanpa autentikasi atau login pengguna.
- ACL tanpa Resource: Beberapa skenario mungkin hanya menargetkan tipe resource bukan resource individual seperti izin
write-articleread-log. Ini tidak mengontrol akses ke artikel atau log tertentu. - RBAC (Role-Based Access Control Kontrol Akses Berbasis Peran)
- RBAC dengan Resource Role: Pengguna dan resource dapat memiliki peran (atau grup) secara bersamaan.
- RBAC dengan Domain/Tenant: Pengguna dapat mengatur set peran yang berbeda untuk domain/tenant yang berbeda.
- ABAC (Attribute-Based Access Control Kontrol Akses Berbasis Atribut): Mendukung penggunaan syntax sugar seperti
resource.Owneruntuk mendapatkan atribut elemen. - RESTful: Mendukung path seperti
/res/*/res/:iddan metode HTTP sepertiGETPOSTPUTDELETE. - Deny Priority: Mendukung otorisasi allow dan deny deny memiliki prioritas lebih tinggi daripada allow.
- Priority: Aturan policy ditentukan prioritasnya sesuai urutan seperti aturan firewall.
Cara Kerja
Dalam Casbin model kontrol akses diabstraksikan menjadi file konfigurasi berbasis PERM PERM mengacu pada Policy (Kebijakan) Effect (Efek) Request (Permintaan) Matcher (Pencocokan) saat memodifikasi mekanisme otorisasi dalam proyek cukup dengan mudah memodifikasi file konfigurasi. Berikut adalah konten file Model konfigurasi normal:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.actIni adalah model kontrol akses ACL paling sederhana.
Policy
Dalam file konfigurasi bagian definisi policy adalah:
[policy_definition]
p = sub, obj, actp mengacu pada policy tidak dapat diganti dengan karakter lain sub mengacu pada subject adalah subjek policy obj adalah object adalah objek policy act adalah action mengacu pada tindakan.
p = sub, obj, actJuga dapat memiliki field keempat eft jika diabaikan default eft adalah allow.
p=sub, obj, act, eftBaris definisi ini hanya menggambarkan bagaimana cara menulis policy bukan definisi policy yang sebenarnya. Berikut adalah contoh policy konkret:
p, jojo, cake, eatp mewakili ini adalah definisi aturan policy jojo adalah subjek policy cake adalah objek policy eat adalah action arti lengkapnya adalah subjek jojo dapat melakukan action eat terhadap objek cake. Aturan policy konkret tidak akan muncul dalam file model akan ada file policy khusus atau database untuk menyimpan policy.
Request
Dalam file konfigurasi bagian definisi request adalah:
[request_definition]
r = sub, obj, actr mengacu pada request tidak dapat diganti dengan karakter lain sub mengacu pada subject adalah subjek request obj adalah object adalah objek request act adalah action mengacu pada action request. Umumnya definisi request dan definisi policy memiliki nama field yang sama. Bagian request tidak menjadi tanggung jawab casbin ini ditentukan oleh developer sendiri apa yang menjadi subjek request apa yang menjadi objek request casbin hanya perlu bertanggung jawab untuk melakukan kontrol akses berdasarkan field yang传入.
Matching
Dalam file konfigurasi bagian definisi matching adalah:
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.actm mengacu pada matcher tidak dapat diganti dengan karakter lain setelahnya adalah aturan matching yang sesuai yang di atas adalah ekspresi boolean sederhana artinya semua field dari request yang传入 cocok dengan semua field dari aturan policy tentu saja bisa juga berupa wildcard atau ekspresi reguler dengan daya ekspresi lebih kuat.
Selain itu matcher juga mendukung syntax in misalnya:
[matchers]
m = r.sub in ("root","admin")Bisa juga:
[matchers]
m = r.sub.Name in (r.obj.Admins)e.Enforce(Sub{Name: "alice"}, Obj{Name: "a book", Admins: []interface{}{"alice", "bob"}})Saat melakukan matching Casbin tidak akan melakukan type checking melainkan将其作为interface melakukan pemeriksaan == untuk kesamaan.
Effect
Bagian definisi effect membuat kombinasi logika lagi pada hasil matching dalam file konfigurasi bagian definisi effect adalah:
[policy_effect]
e = some(where (p.eft == allow))e mengacu pada effect tidak dapat diganti dengan karakter lain. Quantifier some menentukan apakah ada aturan policy yang memenuhi matcher. Quantifier any menentukan apakah semua aturan policy memenuhi matcher.
some(where (p.eft == allow))Aturan ini berarti jika ada satu hasil allow dalam hasil matching maka hasil akhirnya adalah allow.
e = !some(where (p.eft == deny))Aturan ini berarti selama tidak ada hasil deny dalam hasil matching maka hasil akhirnya adalah allow.
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))Aturan ini berarti dalam hasil matching ada satu allow dan tidak ada hasil deny maka hasil akhirnya adalah allow.
Meskipun Casbin mendesain syntax untuk policy effects di atas namun eksekusi saat ini hanya menggunakan policy effects yang di-hardcode. Mereka menganggap fleksibilitas ini tidak terlalu diperlukan. Sejauh ini Anda harus menggunakan policy effects bawaan tidak dapat dikustomisasi policy effects bawaan yang didukung adalah sebagai berikut.
| Definisi Policy effect | Arti | Contoh |
|---|---|---|
| some(where (p.eft == allow)) | allow-override | ACL, RBAC, dll. |
| !some(where (p.eft == deny)) | deny-override | Deny Override |
| some(where (p.eft == allow)) && !some(where (p.eft == deny)) | allow-and-deny | Allow dan Deny |
| priority(p.eft) || deny | priority | Priority |
| subjectPriority(p.eft) | Priority Berbasis Peran | Subject Priority |
TIP
Keempat definisi di atas dapat didefinisikan beberapa kali syntax-nya adalah
type+numbermisalnyar2p2e2m2.File model dapat memiliki komentar menggunakan simbol
#untuk komentar.
Contoh
Berikut adalah contoh mendemonstrasikan proses kerja file model. Pertama definisikan file model ACL sederhana sebagai berikut:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.actFile Policy sebagai berikut:
p, alice, data1, read
p, bob, data2, writeBagaimana mengabstraksikan subject object action proses ini ditentukan oleh logika bisnis di sini tidak penting jadi diabaikan. Berikut ditampilkan request yang传入 dengan cara paling sederhana sebagai berikut:
alice, data1, read
bob, data1, read
alice, data2, write
bob, data2, writeFile policy mendefinisikan alice memiliki izin untuk melakukan operasi read pada data1 bob memiliki izin untuk melakukan operasi write pada data2 maka dalam request yang传入:
alice, data1, readMenunjukkan alice ingin melakukan operasi read pada data1:
bob, data1, readMenunjukkan bob ingin melakukan operasi read pada data1 sisanya sama. Maka hasil akhirnya adalah:
true
false
false
trueIni adalah contoh ACL paling sederhana Situs resmi Casbin memungkinkan editing online dan testing contoh kunjungi Casbin editor untuk testing.
RBAC
RBAC (Role-Based-Access-Control) kontrol akses berbasis peran dibandingkan dengan model ACL akan ada tambahan [role_definition] berikut adalah model RBAC sederhana:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.actDi mana definisi peran adalah sebagai berikut:
[role_definition]
g = _, _g mengacu pada group tidak dapat diganti dengan karakter lain mendukung pembuatan beberapa dengan cara type+number _ adalah placeholder menunjukkan berapa banyak parameter input. Umumnya dalam Policy g biasanya dalam format berikut:
g, alice, data2_admin
g, mike, data1_admin
g, data1_admin data2_adminalice mengacu pada subject data2_admin mengacu pada peran secara ketat casbin akan menganggapnya sebagai string bagaimana memahami arti dan penggunaannya tergantung pada developer.
g, alice, data2_adminMenunjukkan alice memiliki peran data2_admin
g, mike, data1_adminMenunjukkan mike memiliki peran data1_admin
g, data1_admin data2_adminMenunjukkan peran data1_admin memiliki peran data2_admin ini adalah hubungan inheritance antara peran.
Model Resource Role
Model resource role menambahkan g2 sebagai definisi peran resource definisi model adalah sebagai berikut:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
g2 = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && g2(r.obj, p.obj) && r.act == p.actDefinisi contoh Policy sebagai berikut:
p, alice, data1, read
p, bob, data2, write
p, data_group_admin, data_group, write
g, alice, data_group_admin
g2, data1, data_group
g2, data2, data_groupDi mana g2 mendefinisikan grup peran resource memberikan resource kepada peran yang berbeda sekaligus mengatur hubungan pengguna antara peran pengguna dan peran resource.
p, data_group_admin, data_group, writePolicy ini mendefinisikan pengguna dengan peran data_group_admin dapat melakukan operasi write pada resource dengan peran data_group.
Model Domain Multi-Tenant
[request_definition]
r = sub, dom, obj, act
[policy_definition]
p = sub, dom, obj, act
[role_definition]
g = _, _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.actModel domain multi-tenant dibandingkan dengan model RBAC tradisional memiliki field dom tambahan digunakan untuk menunjukkan domain tempat subject berada. Contoh Policy sebagai berikut:
p, admin, domain1, data1, read
p, admin, domain1, data1, write
p, admin, domain2, data2, read
p, admin, domain2, data2, write
g, alice, admin, domain1
g, bob, admin, domain2Misalnya:
p, admin, domain1, data1, readMendefinisikan subject admin yang termasuk dalam domain domain1 memiliki izin untuk melakukan operasi read pada data1
g, alice, admin, domain1Mendefinisikan alice termasuk dalam domain1 memiliki peran admin
