التخطي إلى المحتوى الرئيسي

Priority Model

Casbin يدعم تحميل السياسات بأولوية.

تحميل السياسة بأولوية ضمنية

إنها بسيطة جداً: الترتيب يحدد الأولوية؛ السياسات التي تظهر أولاً لها أولوية أعلى.

model.conf:

[policy_effect]
e = priority(p.eft) || deny

تحميل السياسة بأولوية صريحة

انظر أيضاً: casbin#550

قيمة الأولوية الأصغر تشير إلى أولوية أعلى. إذا كان هناك حرف غير رقمي في الأولوية، سيتم وضعه في الأخير بدلاً من إظهار خطأ.

اتفاقية تسمية الرموز

اسم الرمز المستخدم تقليدياً في تعريف السياسة هو "الأولوية". لكي تستخدم واحداً مخصصاً، تحتاج إلى استدعاء 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