Ana içeriğe atla

Priority Model

Casbin, öncelikli politikaları yüklemeyi destekler.

Örtülü Öncelikli Politika Yükleme

Oldukça basit: sıralama önceliği belirler; daha önce görünen politikalar daha yüksek önceliğe sahiptir.

model.conf:

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

Açık Öncelikli Politika Yükleme

Ayrıca bakınız: casbin#550

Daha küçük bir öncelik değeri, daha yüksek bir önceliği gösterir. Eğer öncelikte sayısal olmayan bir karakter varsa, bir hata atmak yerine en son konulacaktır.

Token adı kuralı

Politika tanımında geleneksel olarak kullanılan öncelik token adı "priority"dir. Özelleştirilmiş bir tane kullanmak için e.SetFieldIndex() çağırmanız ve politikaları yeniden yüklemeniz gerekir (tam örnek için TestCustomizedFieldIndex adresine bakın).

model.conf:

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

Golang kod örneği:

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`

Şu anda, açık öncelik sadece AddPolicy ve AddPolicies desteklemektedir. Eğer UpdatePolicy çağrılmışsa, öncelik özniteliğini değiştirmemelisiniz.

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

istek:

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

Rol ve Kullanıcı Hiyerarşisine Göre Öncelikli Politika Yükleme

Rol ve kullanıcıların miras alınan yapısı sadece çoklu ağaçlar olabilir, grafikler değil. Bir kullanıcının birden fazla rolü varsa, kullanıcının farklı ağaçlarda aynı düzeyde olduğundan emin olmalısınız. İki rol aynı düzeye sahipse, daha önce görünen politika (rolle ilişkili) daha yüksek önceliğe sahiptir. Daha fazla ayrıntı için, ayrıca casbin#833 ve casbin#831'e bakın.

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

İstek:

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

Rol hiyerarşisi şu şekildedir:

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

└─ role: subscriber
└─ user: alice

Öncelik otomatik olarak şu şekildedir:

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