RBAC
ロール定義
[role_definition]
は、RBACロールの継承関係を定義するために使用されます。 Casbinは、ユーザーがロールとその継承関係を持ち、リソースもロールとその継承関係を持つことができる、RBACシステムの複数のインスタンスをサポートしています。 これら二つのRBACシステムは互いに干渉しません。
このセクションはオプションです。 モデルでRBACロールを使用しない場合、このセクションを省略してください。
[role_definition]
g = _, _
g2 = _, _
上記のロール定義は、g
がRBACシステムであり、g2
が別のRBACシステムであることを示しています。 _,_
は、継承関係に関与する二つの当事者があることを意味します。 最も一般的なケースでは、ユーザーのロールだけが必要な場合は通常g
だけを使用します。 ユーザーとリソースの両方に対してロール(またはグループ)が必要な場合、g
とg2
の両方を使用することもできます。 例として、rbac_model.confとrbac_model_with_resource_roles.confをご覧ください。
Casbinは、実際のユーザー-ロールマッピング(またはリソースにロールを使用している場合はリソース-ロールマッピング)をポリシーに保存します。 例えば:
p, data2_admin, data2, read
g, alice, data2_admin
これは、alice
がロールdata2_admin
の継承者/メンバーであることを意味します。 ここで、alice
はユーザー、リソース、またはロールになることができます。 Casbinはそれを文字列として認識します。
次に、マッチャーでは、以下に示すようにロールをチェックする必要があります:
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
これは、リクエストのsub
がポリシーのロールsub
を持つべきであることを意味します。
- Casbinはユーザー-ロールマッピングのみを保存します。
- Casbinはユーザーが有効なユーザーであるか、ロールが有効なロールであるかを確認しません。 それは認証によって管理されるべきです。
- RBACシステム内でユーザーとロールに同じ名前を使用しないでください。なぜなら、Casbinはユーザーとロールを文字列として認識し、ユーザー
alice
を指定しているのか、ロールalice
を指定しているのかをCasbinが知る方法はありません。 これは単純にrole_alice
を使用することで解決できます。 A
がロールB
を持ち、B
がロールC
を持つ場合、A
はロールC
を持ちます。 この推移性は現在無限です。
慣習的に、ポリシー定義の主体トークン名はsub
で、最初に配置されます。 現在、Golang Casbinはカスタマイズされたトークン名と場所をサポートしています。 主体トークン名がsub
の場合、主体トークンは追加のアクションなしで任意の場所に配置できます。 主題トークン名が sub
でない場合、e.SetFieldIndex()
は、その位置に関係なく、エンフォーサが初期化された後に constant.SubjectIndex
に対して呼び出されるべきです。
# `subject` here is for sub
[policy_definition]
p = obj, act, subject
e.SetFieldIndex("p", constant.SubjectIndex, 2) // index starts from 0
ok, err := e.DeleteUser("alice") // without SetFieldIndex, it will raise an error
ロール階層
CasbinのRBACはRBAC1のロール階層機能をサポートしており、これは alice
が role1
を持ち、role1
が role2
を持っている場合、alice
も role2
を持ち、その権限を継承するということを意味します。
ここでは、階層レベルという概念があります。 したがって、この例では、階層レベルは2です。 Casbinの組み込みロールマネージャでは、最大階層レベルを指定することができます。 デフォルト値は10です。 これは、alice
のようなエンドユーザーがロールのレベルを10までしか継承できないことを意味します。
// NewRoleManager is the constructor for creating an instance of the
// default RoleManager implementation.
func NewRoleManager(maxHierarchyLevel int) rbac.RoleManager {
rm := RoleManager{}
rm.allRoles = &sync.Map{}
rm.maxHierarchyLevel = maxHierarchyLevel
rm.hasPattern = false
return &rm
}
ロールとユーザーをどのように区別するか?
CasbinはそのRBACでロールとユーザーを区別しません。 両方とも文字列として扱われます。 もし単一レベルのRBAC(ロールが他のロールのメンバーになることがない)だけを使用する場合、e.GetAllSubjects()
を使用してすべてのユーザーを取得し、e.GetAllRoles()
を使用してすべてのロールを取得することができます。 これらは、すべての g, u, r
ルールの中で、すべての u
とすべての r
をそれぞれリストアップします。
しかし、もし多レベルのRBAC(ロール階層付き)を使用していて、あなたのアプリケーションが名前(文字列)がユーザーかロールかを記録していない場合、または同じ名前のユーザーとロールがある場合、Casbinに渡す前にロールに role::admin
のようなプレフィックスを追加することができます。 この方法で、プレフィックスをチェックすることでそれがロールであるかどうかを知ることができます。
暗黙的なロールや権限をどのように問い合わせるか?
ユーザーがポリシールールで直接割り当てられるのではなく、RBAC階層を通じてロールや権限を継承する場合、このタイプの割り当てを「暗黙的」と呼びます。 このような暗黙的な関係を問い合わせるには、GetRolesForUser()
やGetPermissionsForUser()
の代わりに、これらの2つのAPI:GetImplicitRolesForUser()
とGetImplicitPermissionsForUser()
を使用する必要があります。 詳細については、このGitHub issueをご覧ください。
RBACでのパターンマッチングの使用
パターン付きRBACを参照してください
ロールマネージャ
詳細については、ロールマネージャセクションを参照してください。