Langkau ke kandungan utama

ABAC

Apakah model ABAC?

ABAC bermaksud Attribute-Based Access Control. Ia membolehkan anda mengawal akses dengan menggunakan atribut (sifat) subjek, objek, atau tindakan bukannya menggunakan nilai rentetan itu sendiri. Anda mungkin pernah mendengar tentang bahasa kawalan akses ABAC yang kompleks yang disebut XACML. ABAC Casbin, sebaliknya, jauh lebih mudah. Dalam ABAC Casbin, anda boleh menggunakan struktur atau contoh kelas sebagai ganti rentetan untuk elemen model.

Mari kita lihat contoh ABAC rasmi:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == r.obj.Owner

Dalam matcher, kami menggunakan r.obj.Owner bukan r.obj. r.obj yang diteruskan dalam fungsi Enforce() akan menjadi struktur atau contoh kelas dan bukannya rentetan. Casbin akan menggunakan refleksi untuk mengambil pemboleh ubah ahli obj dalam struktur atau kelas tersebut untuk anda.

Berikut adalah definisi untuk struktur atau kelas r.obj:

type testResource struct {
Name string
Owner string
}

Jika anda ingin menyampaikan parameter kepada enforcer melalui JSON, anda perlu mengaktifkan fungsi tersebut dengan e.EnableAcceptJsonRequest(true).

Sebagai contoh:

e, _ := NewEnforcer("examples/abac_model.conf")
e.EnableAcceptJsonRequest(true)

data1Json := `{ "Name": "data1", "Owner": "bob"}`

ok, _ := e.Enforce("alice", data1Json, "read")
nota

Mengaktifkan fungsi penerimaan parameter JSON boleh mengakibatkan penurunan prestasi sebanyak 1.1 hingga 1.5 kali ganda.

Bagaimana menggunakan ABAC?

Untuk menggunakan ABAC, anda perlu melakukan dua perkara:

  1. Nyatakan atribut-atribut dalam penapis model.
  2. Hantar turunan struktur atau contoh kelas untuk elemen tersebut sebagai argumen kepada fungsi Enforce() Casbin.
bahaya

Pada masa ini, hanya elemen permintaan seperti r.sub, r.obj, r.act, dan sebagainya yang menyokong ABAC. Anda tidak boleh menggunakannya pada elemen polisi seperti p.sub kerana tidak ada cara untuk menentukan struktur atau kelas dalam polisi Casbin.

petua

Anda boleh menggunakan berbilang atribut ABAC dalam penapis. Contohnya: m = r.sub.Domain == r.obj.Domain.

petua

Jika anda perlu menggunakan koma dalam polisi yang bercanggah dengan pemisah CSV, anda boleh mengelakkannya dengan mengelilingi pernyataan tersebut dengan tanda petikan. Sebagai contoh, "keyMatch("bob", r.sub.Role)" tidak akan dipisahkan.

Menskalakan model untuk peraturan ABAC yang kompleks dan banyak

Penerapan model ABAC di atas adalah mudah pada intinya. Namun, dalam banyak kes, sistem kebenaran memerlukan sejumlah besar dan kompleks peraturan ABAC. Untuk mengikuti keperluan ini, disarankan untuk menambahkan peraturan dalam dasar dan bukannya dalam model. Ini boleh dilakukan dengan memperkenalkan konstruk fungsi eval(). Berikut adalah contohnya:

Ini adalah definisi fail CONF yang digunakan untuk menentukan model ABAC.

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub_rule, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = eval(p.sub_rule) && r.obj == p.obj && r.act == p.act

Dalam contoh ini, p.sub_rule adalah struktur atau kelas (jenis yang ditentukan pengguna) yang mengandungi atribut yang diperlukan untuk digunakan dalam dasar.

Ini adalah dasar yang digunakan terhadap model untuk Penguatkuasaan. Sekarang, anda boleh menggunakan contoh objek yang diteruskan ke eval() sebagai parameter untuk menentukan beberapa kekangan ABAC.

p, r.sub.Age > 18, /data1, read
p, r.sub.Age < 60, /data2, write