Langkau ke kandungan utama

Priority Model

Casbin menyokong memuatkan polisi dengan keutamaan.

Muat Polisi dengan Keutamaan Tersirat

Ia sangat mudah: susunan menentukan keutamaan; polisi yang muncul lebih awal mempunyai keutamaan yang lebih tinggi.

model.conf:

[policy_effect]
e = priority(p.eft) || deny

Muat Polisi dengan Keutamaan Eksplisit

Lihat juga: casbin#550

Nilai keutamaan yang lebih kecil menunjukkan keutamaan yang lebih tinggi. Jika terdapat watak bukan angka dalam keutamaan, ia akan diletakkan terakhir bukannya membuang ralat.

Konvensyen nama token

Nama token keutamaan yang biasa digunakan dalam definisi polisi ialah "priority". Untuk menggunakan yang disesuaikan, anda perlu memanggil e.SetFieldIndex() dan memuat semula polisi (lihat contoh lengkap di TestCustomizedFieldIndex).

model.conf:

[policy_definition]
p = customized_priority, sub, obj, act, eft

Contoh kod Golang:

e, _ := NewEnforcer("./example/priority_model_explicit_customized.conf",
"./example/priority_policy_explicit_customized.csv")
// Due to the customized priority token, the enforcer fails to handle the priority.
ok, err := e.Enforce("bob", "data2", "read") // the result will be `true, nil`
// Set PriorityIndex and reload
e.SetFieldIndex("p", constant.PriorityIndex, 0)
err := e.LoadPolicy()
if err != nil {
log.Fatalf("LoadPolicy: %v", err)
}
ok, err := e.Enforce("bob", "data2", "read") // the result will be `false, nil`

Pada masa ini, keutamaan eksplisit hanya menyokong AddPolicy & AddPolicies. Jika UpdatePolicy telah dipanggil, anda tidak sepatutnya mengubah atribut keutamaan.

model.conf:

[request_definition]
r = sub, obj, act

[policy_definition]
p = priority, sub, obj, act, eft

[role_definition]
g = _, _

[policy_effect]
e = priority(p.eft) || deny

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

policy.csv

p, 10, data1_deny_group, data1, read, deny
p, 10, data1_deny_group, data1, write, deny
p, 10, data2_allow_group, data2, read, allow
p, 10, data2_allow_group, data2, write, allow


p, 1, alice, data1, write, allow
p, 1, alice, data1, read, allow
p, 1, bob, data2, read, deny

g, bob, data2_allow_group
g, alice, data1_deny_group

permintaan:

alice, data1, write --> true // because `p, 1, alice, data1, write, allow` has the highest priority
bob, data2, read --> false
bob, data2, write --> true // because bob has the role of `data2_allow_group` which has the right to write data2, and there's no deny policy with higher priority

Muat Polisi dengan Keutamaan Berdasarkan Peranan dan Hierarki Pengguna

Struktur yang diwarisi bagi peranan dan pengguna hanya boleh berupa pelbagai pokok, bukan graf. Jika seorang pengguna mempunyai pelbagai peranan, anda perlu memastikan pengguna itu mempunyai tahap yang sama dalam pokok yang berbeza. Jika dua peranan mempunyai tahap yang sama, polisi (yang berkaitan dengan peranan) yang muncul lebih awal mempunyai keutamaan yang lebih tinggi. Untuk butiran lanjut, lihat juga casbin#833 dan casbin#831.

model.conf:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act, eft

[role_definition]
g = _, _

[policy_effect]
e = subjectPriority(p.eft) || deny

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

policy.csv

p, root, data1, read, deny
p, admin, data1, read, deny

p, editor, data1, read, deny
p, subscriber, data1, read, deny

p, jane, data1, read, allow
p, alice, data1, read, allow

g, admin, root

g, editor, admin
g, subscriber, admin

g, jane, editor
g, alice, subscriber

Permintaan:

jane, data1, read --> true // because jane is at the bottom, her priority is higher than that of editor, admin, and root
alice, data1, read --> true

Hierarki peranan kelihatan seperti ini:

role: root
└─ role: admin
├─ role editor
│ └─ user: jane

└─ role: subscriber
└─ user: alice

Keutamaan secara automatik kelihatan seperti ini:

role: root                 # auto priority: 30
└─ role: admin # auto priority: 20
├─ role: editor # auto priority: 10
└─ role: subscriber # auto priority: 10