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をご覧ください。