Перейти к основному содержимому

Модель приоритетов

Casbin может применять приоритет к политикам: при совпадении нескольких политик побеждает та, у которой самый высокий приоритет (и она может разрешать или запрещать доступ).

Неявный приоритет (порядок политики)​

Порядок политики определяет приоритет: первая в списке имеет наивысший приоритет. Используйте этот эффект:

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

Явный приоритет (числовое поле)​

Добавьте поле priority в политику; меньшее число = более высокий приоритет. Нечисловые значения считаются имеющими наименьший приоритет. См. casbin#550.

Настраиваемое поле приоритета

Имя поля приоритета по умолчанию — priority. Для другого имени (например, customized_priority) вызовите e.SetFieldIndex("p", constant.PriorityIndex, index) после инициализации и перезагрузите политику. Пример: TestCustomizedFieldIndex.

Пример с явным приоритетом в политике:

[policy_definition]
p = customized_priority, sub, obj, act, eft

Пример кода на Go:

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.

Полная модель:

[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

Приоритет субъекта (иерархия ролей/пользователей)​

Используйте subjectPriority(p.eft), чтобы приоритет определялся иерархией ролей: листовые узлы (например, конечные пользователи) имеют более высокий приоритет, чем внутренние роли. Иерархия должна представлять собой деревья, а не графы; если у пользователя несколько ролей, они должны находиться на одинаковой глубине в каждом дереве. Связи одного уровня разрешаются по порядку политик. См. casbin#833, casbin#831.

Model:

[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

Request:

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

Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.