Lewati ke konten utama

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.

Konvensi nama token

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