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
とAddNamedDomainMatchingFunc
APIを通じてパターンマッチングを有効にする必要があります。これらはパターンがどのようにマッチするかを決定します。
オンラインエディタを使用する場合、左下の角でパターンマッチング関数を指定します。
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
をよりエレガントで効果的な方法で実装することができます。