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
これは、tenant1
のadmin
ロールがdata1
を読むことができることを意味します。 そして、alice
はtenant1
でadmin
ロールを持ち、tenant2
でuser
ロールを持っています。 したがって、彼女はdata1
を読むことができます。 しかし、alice
はtenant2
のadmin
ではないので、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