RBAC with Pattern
クイックスタート
g(_, _)でパターンを使用します。e, _ := NewEnforcer("./example.conf", "./example.csv")
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)ドメインでパターンを使用します。
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)すべてのパターンを使用します。
両方のAPIの使用を組み合わせるだけです。
上記のように、enforcerインスタンスを作成した後、AddNamedMatchingFuncとAddNamedDomainMatchingFuncAPIを通じてパターンマッチングを有効にする必要があります。これらはパターンがどのようにマッチするかを決定します。
If you use the online editor, You can add a pattern matching function by clicking the "Add Role Matching" button in the lower left corner.

RBACでのパターンマッチングの使用
時々、特定のパターンを持つ特定の主体、オブジェクト、またはドメイン/テナントに自動的に役割を付与したい場合があります。 RBACのパターンマッチング関数は、それを実現するのに役立ちます。 パターンマッチング関数は、前のマッチャー関数と同じパラメータと戻り値を共有します。
パターンマッチング関数はgの各パラメータをサポートします。
通常、RBACはマッチャーでg(r.sub, p.sub)として表現されることを知っています。 その後、以下のようなポリシーを使用できます:
p, alice, book_group, read
g, /book/1, book_group
g, /book/2, book_group
したがって、aliceはbook 1とbook 2を含むすべての本を読むことができます。 しかし、数千冊の本があり、各本を一つのgポリシールールで本の役割(またはグループ)に追加するのは非常に面倒です。
しかし、パターンマッチング関数を使用すると、ポリシーを一行で書くことができます:
g, /book/:id, book_group
Casbinは自動的に/book/1と/book/2をパターン/book/:idにマッチさせます。 あなたはエンフォーサーで関数を登録するだけでよいです:
- Go
- Node.js
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedMatchingFunc('g', Util.keyMatch2Func);
ドメイン/テナントでパターンマッチング関数を使用する場合、エンフォーサーとモデルで関数を登録する必要があります。
- Go
- Node.js
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedDomainMatchingFunc('g', Util.keyMatch2Func);
もしg(r.sub, p.sub, r.dom)が何を意味するのかわからない場合は、rbac-with-domainsを読んでください。 要するに、g(r.sub, p.sub, r.dom)はユーザーr.subがドメインr.domで役割p.subを持っているかどうかを確認します。 これがマッチャーの動作方法です。 完全な例はここで見ることができます。
上記のパターンマッチング構文とは別に、純粋なドメインパターンも使用できます。
例えば、subが異なるドメイン、domain1とdomain2でアクセスを持つことを望む場合、純粋なドメインパターンを使用できます:
p, admin, domain1, data1, read
p, admin, domain1, data1, write
p, admin, domain2, data2, read
p, admin, domain2, data2, write
g, alice, admin, *
g, bob, admin, domain2
この例では、aliceがdomain1とdomain2でdataを読み書きすることを望んでいます。 gでのパターンマッチング*は、aliceが二つのドメインにアクセスできるようにします。
パターンマッチングを使用することで、特に複雑で多くのドメインやオブジェクトを考慮する必要があるシナリオでは、policy_definitionをよりエレガントで効果的な方法で実装することができます。