Priority Model
Casbin hỗ trợ tải các chính sách với mức độ ưu tiên.
Tải Chính Sách với Ưu Tiên Ngầm Định
Nó khá đơn giản: thứ tự quyết định mức độ ưu tiên; các chính sách xuất hiện trước có mức độ ưu tiên cao hơn.
model.conf:
[policy_effect]
e = priority(p.eft) || deny
Tải Chính Sách với Ưu Tiên Rõ Ràng
Xem thêm: casbin#550
Một giá trị ưu tiên nhỏ hơn chỉ ra mức độ ưu tiên cao hơn. Nếu có một ký tự không phải số trong ưu tiên, nó sẽ được đặt ở cuối thay vì ném ra lỗi.
Tên token ưu tiên thường được sử dụng trong định nghĩa chính sách là "priority". Để sử dụng một tên tùy chỉnh, bạn cần gọi e.SetFieldIndex()
và tải lại các chính sách (xem ví dụ đầy đủ tại TestCustomizedFieldIndex).
model.conf:
[policy_definition]
p = customized_priority, sub, obj, act, eft
Ví dụ mã 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`
Hiện tại, ưu tiên rõ ràng chỉ hỗ trợ AddPolicy
& AddPolicies
. Nếu UpdatePolicy
đã được gọi, bạn không nên thay đổi thuộc tính ưu tiên.
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
request:
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
Tải Chính Sách với Mức Độ Ưu Tiên Dựa trên Vai Trò và Hệ Thống Người Dùng
Cấu trúc kế thừa của vai trò và người dùng chỉ có thể là nhiều cây, không phải đồ thị. Nếu một người dùng có nhiều vai trò, bạn phải đảm bảo người dùng có cùng mức độ trong các cây khác nhau. Nếu hai vai trò có cùng mức độ, chính sách (liên kết với vai trò) xuất hiện sớm hơn sẽ có mức độ ưu tiên cao hơn. Để biết thêm chi tiết, cũng xem casbin#833 và 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
Yêu cầu:
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
Hệ thống phân cấp vai trò trông như thế này:
role: root
└─ role: admin
├─ role editor
│ └─ user: jane
│
└─ role: subscriber
└─ user: alice
Mức độ ưu tiên tự động trông như thế này:
role: root # auto priority: 30
└─ role: admin # auto priority: 20
├─ role: editor # auto priority: 10
└─ role: subscriber # auto priority: 10