メインコンテンツにスキップ

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`

現在、明示的な優先度はAddPolicyAddPoliciesのみをサポートしています。 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

ロールとユーザーの階層に基づいた優先度でポリシーをロードする

ロールとユーザーの継承構造は、グラフではなく複数のツリーでなければなりません。 ユーザーが複数のロールを持つ場合、ユーザーが異なるツリーで同じレベルを持っていることを確認する必要があります。 2つのロールが同じレベルを持つ場合、先に表示されたポリシー(ロールに関連付けられた)の優先度が高くなります。 詳細については、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

リクエスト:

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