ข้ามไปยังเนื้อหาหลัก

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