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

RBAC

ロール定義

[role_definition]は、RBACロールの継承関係を定義するために使用されます。 Casbinは、ユーザーがロールとその継承関係を持ち、リソースもロールとその継承関係を持つことができる、RBACシステムの複数のインスタンスをサポートしています。 これら二つのRBACシステムは互いに干渉しません。

このセクションはオプションです。 モデルでRBACロールを使用しない場合、このセクションを省略してください。

[role_definition]
g = _, _
g2 = _, _

上記のロール定義は、gがRBACシステムであり、g2が別のRBACシステムであることを示しています。 _,_は、継承関係に関与する二つの当事者があることを意味します。 最も一般的なケースでは、ユーザーのロールだけが必要な場合は通常gだけを使用します。 ユーザーとリソースの両方に対してロール(またはグループ)が必要な場合、gg2の両方を使用することもできます。 例として、rbac_model.confrbac_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を持つべきであることを意味します。

メモ
  1. Casbinはユーザー-ロールマッピングのみを保存します。
  2. Casbinはユーザーが有効なユーザーであるか、ロールが有効なロールであるかを確認しません。 それは認証によって管理されるべきです。
  3. RBACシステム内でユーザーとロールに同じ名前を使用しないでください。なぜなら、Casbinはユーザーとロールを文字列として認識し、ユーザーaliceを指定しているのか、ロールaliceを指定しているのかをCasbinが知る方法はありません。 これは単純にrole_aliceを使用することで解決できます。
  4. 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のロール階層機能をサポートしており、これは alicerole1 を持ち、role1role2 を持っている場合、alicerole2 を持ち、その権限を継承するということを意味します。

ここでは、階層レベルという概念があります。 したがって、この例では、階層レベルは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を参照してください

ロールマネージャ

詳細については、ロールマネージャセクションを参照してください。