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