Priority Model
Casbin mendukung pemuatan kebijakan dengan prioritas.
Muat Kebijakan dengan Prioritas Implisit
Ini cukup sederhana: urutan menentukan prioritas; kebijakan yang muncul lebih awal memiliki prioritas lebih tinggi.
model.conf:
[policy_effect]
e = priority(p.eft) || deny
Muat Kebijakan dengan Prioritas Eksplisit
Lihat juga: casbin#550
Nilai prioritas yang lebih kecil menunjukkan prioritas yang lebih tinggi. Jika ada karakter non-numerik dalam prioritas, itu akan ditempatkan terakhir alih-alih melempar kesalahan.
Nama token prioritas yang biasa digunakan dalam definisi kebijakan adalah "priority". Untuk menggunakan yang kustom, Anda perlu memanggil e.SetFieldIndex()
dan memuat ulang kebijakan (lihat contoh lengkap di TestCustomizedFieldIndex).
model.conf:
[policy_definition]
p = customized_priority, sub, obj, act, eft
Contoh kode 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`
Saat ini, prioritas eksplisit hanya mendukung AddPolicy
& AddPolicies
. Jika UpdatePolicy
telah dipanggil, Anda sebaiknya tidak mengubah atribut prioritas.
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 Kebijakan dengan Prioritas Berdasarkan Peran dan Hierarki Pengguna
Struktur yang diwariskan dari peran dan pengguna hanya bisa berupa beberapa pohon, bukan graf. Jika seorang pengguna memiliki beberapa peran, Anda harus memastikan bahwa pengguna tersebut memiliki tingkat yang sama dalam pohon yang berbeda. Jika dua peran memiliki tingkat yang sama, kebijakan (yang terkait dengan peran) yang muncul lebih awal memiliki prioritas lebih tinggi. Untuk detail lebih 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 peran tampak seperti ini:
role: root
└─ role: admin
├─ role editor
│ └─ user: jane
│
└─ role: subscriber
└─ user: alice
Prioritas otomatis tampak seperti ini:
role: root # auto priority: 30
└─ role: admin # auto priority: 20
├─ role: editor # auto priority: 10
└─ role: subscriber # auto priority: 10