Bỏ qua đến nội dung chính

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.

Quy ước tên token

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#833casbin#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