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

RBAC with Domains

ドメインテナントとの役割定義

CasbinのRBACロールは、グローバルまたはドメイン固有のものにすることができます。 ドメイン固有の役割とは、ユーザーが異なるドメイン/テナントにいるときに、そのユーザーの役割が異なることを意味します。 これは、ユーザーが通常異なるテナントにいる大規模なシステム、例えばクラウドにとって非常に有用です。

ドメイン/テナントとの役割定義は次のようになるべきです:

[role_definition]
g = _, _, _

3番目の_はドメイン/テナントの名前を表し、この部分は変更しないでください。 その後、ポリシーは次のようになります:

p, admin, tenant1, data1, read
p, admin, tenant2, data2, read

g, alice, admin, tenant1
g, alice, user, tenant2

これは、tenant1adminロールがdata1を読むことができることを意味します。 そして、alicetenant1adminロールを持ち、tenant2userロールを持っています。 したがって、彼女はdata1を読むことができます。 しかし、alicetenant2adminではないので、data2を読むことはできません。

その後、マッチャーでは、次のようにロールをチェックする必要があります:

[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act

例については、rbac_with_domains_model.confを参照してください。

トークン名の規約

注:慣例的に、ポリシー定義のドメイントークン名はdomで、2番目のトークン(sub, dom, obj, act)として配置されます。 現在、Golang Casbinはカスタマイズされたトークン名と配置をサポートしています。 ドメイントークン名がdomの場合、ドメイントークンは追加のアクションなしで任意の位置に配置することができます。 ドメイントークン名がdomでない場合、エンフォーサーが初期化された後に、その位置に関係なくconstant.DomainIndexのためのe.SetFieldIndex()を呼び出す必要があります。

# `domain` here for `dom`
[policy_definition]
p = sub, obj, act, domain
e.SetFieldIndex("p", constant.DomainIndex, 3) // index starts from 0
users := e.GetAllUsersByDomain("domain1") // without SetFieldIndex, it will raise an error