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

How It Works

Casbinでは、アクセス制御モデルは**PERMメタモデル(Policy、Effect、Request、Matchers)**に基づいてCONFファイルに抽象化されます。 プロジェクトの認可メカニズムを切り替えるかアップグレードすることは、設定を変更するほど簡単です。 利用可能なモデルを組み合わせて、独自のアクセス制御モデルをカスタマイズすることができます。 例えば、RBACの役割とABACの属性を一つのモデル内で組み合わせ、一組のポリシールールを共有することができます。

PERMモデルは、Policy、Effect、Request、Matchersの4つの基盤から構成されています。 これらの基盤は、リソースとユーザーとの関係を記述します。

Request

リクエストパラメータを定義します。 基本的なリクエストはタプルオブジェクトで、少なくとも主体(アクセスされるエンティティ)、オブジェクト(アクセスされるリソース)、アクション(アクセス方法)が必要です。

例えば、リクエスト定義は次のようになるかもしれません:r={sub,obj,act}

この定義は、アクセス制御マッチング関数に必要なパラメータ名と順序を指定します。

Policy

アクセス戦略のモデルを定義します。 ポリシールール文書のフィールドの名前と順序を指定します。

例えば:p={sub, obj, act} または p={sub, obj, act, eft}

注:eft(ポリシー結果)が定義されていない場合、ポリシーファイルの結果フィールドは読み取られず、マッチングポリシー結果はデフォルトで許可されます。

Matcher

RequestとPolicyのマッチングルールを定義します。

例えば:m = r.sub == p.sub && r.act == p.act && r.obj == p.obj このシンプルで一般的なマッチングルールは、リクエストされたパラメータ(エンティティ、リソース、メソッド)がポリシーに記載されているものと等しい場合、ポリシー結果(p.eft)が返されることを意味します。 戦略の結果はp.eftに保存されます。

Effect

Matchersのマッチング結果に対して論理的な組み合わせ判断を行います。

例えば:e = some(where(p.eft == allow))

この文は、マッチング戦略結果p.eftが(いくつかの)許可の結果を持つ場合、最終結果は真であることを意味します。

別の例を見てみましょう:

e = some(where (p.eft == allow)) && !some(where (p.eft == deny))

この例の組み合わせの論理的な意味は:許可の結果にマッチする戦略があり、denyの結果にマッチする戦略がない場合、結果は真です。 言い換えれば、マッチング戦略がすべて許可の場合、真です。 denyがある場合、両方とも偽です(より単純に言えば、許可とdenyが同時に存在する場合、denyが優先されます)。

Casbinで最も基本的で最もシンプルなモデルはACLです。 ACLのモデルCONFは次の通りです:

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

# Policy effect
[policy_effect]
e = some(where (p.eft == allow))

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

ACLモデルのポリシー例は次の通りです:

p, alice, data1, read
p, bob, data2, write

これは次の意味です:

  • aliceはdata1を読むことができます
  • bobはdata2を書き込むことができます

また、末尾に''を追加することで、マルチラインモードもサポートしています:

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act

さらに、ABACを使用している場合、以下の例のように'in'演算子を試すことができます。ただし、これはCasbinのgolang版でのみ可能で、jCasbinとNode-Casbinはまだサポートされていません:

# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')

しかし、配列の長さが1よりも大きいことを必ず確認してください。そうでないとパニックを引き起こします。

他の演算子については、govaluateをご覧ください。