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