RBAC
役割の定義
[role_definition] は、RBAC ロール継承関係の定義です。 Casbinは複数のRBACシステムをサポートしています。例えば、 ユーザーはロールと継承関係を持つことができ、リソースにはロールと継承関係も持つことができます。 この2つの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 == p.act
これは、リクエスト内の サブ を意味し、ポリシー内でロール サブ を持つ必要があります。
note
- Casbin にはユーザーのロールマッピングのみが保存されます。
- Casbin は、ユーザーが有効なユーザーであるか、またはロールが有効なロールであるかどうかを検証しません。 それは認証によって処理されるべきである。
- Casbinはユーザーとロールを文字列として認識しているため、RBACシステム内で同じ名前とロールを使用しないでください そして、Casbinがユーザー
アリスかロールアリスを指定しているかどうかを知る方法はありません。role_aliceを使用するだけで解決できます。 - If
Ahas roleB,Bhas roleC, thenAhas roleC. この遷移は今のところ無限です。
ロール階層型
Casbin's RBAC supports RBAC1's role hierarchy feature, meaning if alice has role1, role1 has role2, then alice will also have role2 and inherit its permissions.
階層レベルという概念があります つまり、この例の階層レベルは2です。 Casbinのビルトインロールマネージャでは、最大階層レベルを指定できます。 デフォルト値は 10 です。 これは、 alice のようなエンドユーザーが、10レベルのロールしか継承できないことを意味します。
// NewRoleManager is the constructor for creating an instance of the
// default RoleManager 実装.
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() を使用してすべてのロールを取得することができます。 これらは u と r のすべてを、それぞれ g, u, r のすべてのルールにリストします。
ただし、マルチレベルRBAC(ロール階層付き)を使用している場合。 また、アプリケーションでは、名前(文字列)がユーザーかロールか、同じ名前のユーザーとロールがあるかどうかは記録されません。 Casbin に渡す前に、 role::admin のようなロールにプレフィックスを追加することができます。 このプレフィックスをチェックすることで、役割があるかどうかを知ることができます。
暗黙のロールまたは権限を問い合わせる方法は?
ユーザーがRBAC階層を介してロールまたは権限を継承した場合、ポリシールールに直接割り当てるのではありません。 このような課題を 暗黙的と呼びます。 そのような暗黙の関係を照会するには GetImplicitRolesForUser() と GetImplicitPermissionsForUser() の代わりに GetRolesForUser() と GetPermissionsForUser() を使用する必要があります。 詳細については、 この GitHub Issue を参照してください。
RBACでパターンマッチングを使用
ロールマネージャー
See Role Managers section for details.