Skip to content

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:

  1. ACL (Access Control List Daftar Kontrol Akses)
  2. ACL dengan Superuser
  3. ACL tanpa Pengguna: Sangat berguna untuk sistem tanpa autentikasi atau login pengguna.
  4. ACL tanpa Resource: Beberapa skenario mungkin hanya menargetkan tipe resource bukan resource individual seperti izin write-article read-log. Ini tidak mengontrol akses ke artikel atau log tertentu.
  5. RBAC (Role-Based Access Control Kontrol Akses Berbasis Peran)
  6. RBAC dengan Resource Role: Pengguna dan resource dapat memiliki peran (atau grup) secara bersamaan.
  7. RBAC dengan Domain/Tenant: Pengguna dapat mengatur set peran yang berbeda untuk domain/tenant yang berbeda.
  8. ABAC (Attribute-Based Access Control Kontrol Akses Berbasis Atribut): Mendukung penggunaan syntax sugar seperti resource.Owner untuk mendapatkan atribut elemen.
  9. RESTful: Mendukung path seperti /res/* /res/:id dan metode HTTP seperti GET POST PUT DELETE.
  10. Deny Priority: Mendukung otorisasi allow dan deny deny memiliki prioritas lebih tinggi daripada allow.
  11. 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:

bash
[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.act

Ini adalah model kontrol akses ACL paling sederhana.

Policy

Dalam file konfigurasi bagian definisi policy adalah:

[policy_definition]
p = sub, obj, act

p 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, act

Juga dapat memiliki field keempat eft jika diabaikan default eft adalah allow.

p=sub, obj, act, eft

Baris definisi ini hanya menggambarkan bagaimana cara menulis policy bukan definisi policy yang sebenarnya. Berikut adalah contoh policy konkret:

p, jojo, cake, eat

p 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, act

r 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.act

m 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)
go
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 effectArtiContoh
some(where (p.eft == allow))allow-overrideACL, RBAC, dll.
!some(where (p.eft == deny))deny-overrideDeny Override
some(where (p.eft == allow)) && !some(where (p.eft == deny))allow-and-denyAllow dan Deny
priority(p.eft) || denypriorityPriority
subjectPriority(p.eft)Priority Berbasis PeranSubject Priority

TIP

  1. Keempat definisi di atas dapat didefinisikan beberapa kali syntax-nya adalah type+number misalnya r2 p2 e2 m2.

  2. 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.act

File Policy sebagai berikut:

p, alice, data1, read
p, bob, data2, write

Bagaimana 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, write

File 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, read

Menunjukkan alice ingin melakukan operasi read pada data1:

bob, data1, read

Menunjukkan bob ingin melakukan operasi read pada data1 sisanya sama. Maka hasil akhirnya adalah:

true
false
false
true

Ini 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.act

Di 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_admin

alice 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_admin

Menunjukkan alice memiliki peran data2_admin

g, mike, data1_admin

Menunjukkan mike memiliki peran data1_admin

g, data1_admin data2_admin

Menunjukkan 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.act

Definisi 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_group

Di 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, write

Policy 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.act

Model 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, domain2

Misalnya:

p, admin, domain1, data1, read

Mendefinisikan subject admin yang termasuk dalam domain domain1 memiliki izin untuk melakukan operasi read pada data1

g, alice, admin, domain1

Mendefinisikan alice termasuk dalam domain1 memiliki peran admin

ABAC

Golang by www.golangdev.cn edit