Priority Model
Casbin รองรับการโหลดนโยบายที่มีความสำคัญ
โหลดนโยบายด้วยความสำคัญที่ไม่ได้ระบุไว้ชัดเจน
มันง่ายมาก: ลำดับความสำคัญถูกกำหนดโดยลำดับการปรากฏ; นโยบายที่ปรากฏก่อนมีความสำคัญสูงกว่า
model.conf:
[policy_effect]
e = priority(p.eft) || deny
โหลดนโยบายด้วยความสำคัญที่ระบุไว้ชัดเจน
ดูเพิ่มเติม: casbin#550
ค่าความสำคัญที่น้อยกว่าหมายถึงความสำคัญที่สูงกว่า หากมีตัวอักษรที่ไม่ใช่ตัวเลขอยู่ในความสำคัญ, มันจะถูกวางไว้ท้ายสุดแทนที่จะทำให้เกิดข้อผิดพลาด
ชื่อโทเค็นความสำคัญที่ใช้กันโดยทั่วไปในนิยามนโยบายคือ "priority" หากต้องการใช้ชื่อที่กำหนดเอง, คุณต้องเรียกใช้ e.SetFieldIndex()
และโหลดนโยบายใหม่ (ดูตัวอย่างเต็มที่ TestCustomizedFieldIndex)
model.conf:
[policy_definition]
p = customized_priority, sub, obj, act, eft
ตัวอย่างโค้ด 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`
ในปัจจุบัน, ความสำคัญที่ระบุไว้ชัดเจนรองรับเฉพาะ AddPolicy
& AddPolicies
หาก UpdatePolicy
ถูกเรียกใช้, คุณไม่ควรเปลี่ยนแปลงคุณสมบัติความสำคัญ
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
คำขอ:
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
โหลดนโยบายด้วยความสำคัญตามบทบาทและลำดับชั้นผู้ใช้
โครงสร้างการสืบทอดของบทบาทและผู้ใช้สามารถเป็นเพียงต้นไม้หลายต้น, ไม่ใช่กราฟ หากผู้ใช้มีบทบาทหลายบทบาท, คุณต้องแน่ใจว่าผู้ใช้มีระดับเดียวกันในต้นไม้ที่แตกต่างกัน หากสองบทบาทมีระดับเดียวกัน, นโยบาย (ที่เกี่ยวข้องกับบทบาท) ที่ปรากฏก่อนมีความสำคัญสูงกว่า สำหรับรายละเอียดเพิ่มเติม, ดูเพิ่มเติมที่ casbin#833 และ 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
คำขอ:
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
ลำดับชั้นบทบาทมีลักษณะดังนี้:
role: root
└─ role: admin
├─ role editor
│ └─ user: jane
│
└─ role: subscriber
└─ user: alice
ความสำคัญจะถูกกำหนดโดยอัตโนมัติดังนี้:
role: root # auto priority: 30
└─ role: admin # auto priority: 20
├─ role: editor # auto priority: 10
└─ role: subscriber # auto priority: 10