モデルの構文
モデルCONFは少なくとも4つのセクションを持つ必要があります:
[request_definition], [policy_definition], [policy_effect], [matchers]
.モデルが RBAC を使用する場合は、
[role_definition]
セクションも追加する必要があります。A model CONF can contain comments. The comments start with
#
, and#
will comment the rest of the line.
要求の定義
[request_definition]
はアクセスリクエストの定義です。 e.Enforce(...)
関数で引数を定義します。
[request_definition]
r = sub, obj, act
sub, obj, act
は、エンティティ(サブジェクト)、アクセスリソース(オブジェクト)、アクセスメソッド(アクション)の古典的なトリプルを表します。 However, you can customize your own request form, like sub, act
if you don't need to specify an particular resource, or sub, sub2, obj, act
if you somehow have two accessing entities.
ポリシーの定義
[policy_definition]
はポリシーの定義です。ポリシーの意味を定義します。例えば、次のモデルがあります。
[policy_definition]
p = sub, obj, act
p2 = sub, act
私たちは、次のポリシーを持っています (ポリシーファイルの場合)
p, alice, data1, read
p2, bob, write-all-objects
ポリシーの各行はポリシールールと呼ばれます。 各ポリシールールは、 ポリシータイプ
、例えば、 p
、 p2
で始まります。 複数の定義がある場合、ポリシー定義と一致するために使用されます。 上記の方針は以下のとおりである。 バインディングはマッチャーで使用できます。
(alice, data1, read) -> (p.sub, p.obj, p.act)
(bob, write-all-objects) -> (p2.sub, p2.act)
tip
The elements in a policy rule are always regarded asstring
. If you have any question about this, please see the discussion at: https://github.com/casbin/casbin/issues/113
ポリシー効果
[policy_effect]
が政策効果の定義である。 複数のポリシールールがリクエストに一致する場合、アクセスリクエストを承認するかどうかを定義します。 たとえば、一つのルールが許可し、もう一つのルールが拒否します。
[policy_effect]
e = some(p.eft == allow))
上記のポリシー効果は、 allow
という一致するポリシールールがある場合に意味します。最終効果は allow
(別名、allow-override) です。 p.eft
はポリシーの効果であり、 許可
または 拒否
とすることができます。 省略可能で、デフォルト値は allow
です。 したがって、上で指定しなかったので、デフォルト値を使用します。
ポリシー効果のもう一つの例は:
[policy_effect]
e = !some(p.eft == deny))
つまり、deny
に一致するポリシールールがない場合、最終的な効果は 許可する
(別名、deny-override) になります。 いくつかの
は、ポリシールールと一致するものが存在する場合を意味します。 any
means : all matched policy rules (not used here). ポリシー効果はロジック式でも接続できます。
[policy_effect]
e = some(p.eft == allow)) && !some(p.eft == deny))
これは、の
に一致したポリシールールdeny
に一致するポリシールールはありません。 このように、許可と拒否の両方がサポートされ、拒否が上書きされます。
note
ポリシーエフェクトの構文を上記のように設計しましたが。 現在の実装では、ハードコードされたポリシー効果のみが使用されています。そのような柔軟性はあまり必要ありませんでした。 だから今のところ、あなた自身のものをカスタマイズするのではなく、組み込みのポリシーエフェクトのいずれかを使用する必要があります。
サポートされている組み込みポリシー効果は次のとおりです。
ポリシー効果 | 意味 | 例 |
---|---|---|
some((p.eft == allow)) | allow-override | ACL, RBAC, その他 |
!some(p.eft == deny)) | deny-override | 無効にする |
some((p.eft == allow)) && !some(p.eft == deny)) | allowand-deny | Allow-and-deny |
priority(p.eft) || 拒否 | 優先度 | 優先度 |
subjectPriority(p.eft) | ロールの優先度ベース | 件名優先度 |
交際者
[matchers]
はポリシーマッチャの定義です。マッチャは式です。リクエストに対してポリシールールがどのように評価されるかを定義します。
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act == p.act
上記のマッチャは最も単純なものであり、リクエスト内のサブジェクト、オブジェクト、およびアクションはポリシールール内のものと一致する必要があることを意味します。
+, -, *, /
のような算術演算子、 &&, |, !
のような論理演算子をマッチャーで使用できます。
複数のセクションタイプ
複数のポリシー定義または複数のマッチャが必要な場合は、 p2
, m2
のように使用できます。 In fact, all of the above four sections can use multiple types and the syntax is r
+number, such as r2
, e2
. デフォルトでは、これらの4つのセクションは1に対応する必要があります。 r2
のように、ポリシー p2
に一致するマッチャー m2
のみを使用します。
You can pass in EnforceContext
as the first parameter of enforce
method to specify the types, the EnforceContext
is like this
EnforceContext{"r2","p2","e2","m2"}
type EnforceContext struct {
RType string
PType string
EType string
MType string
}
const enforceContext = new EnforceContext('r2', 'p2', 'e2', 'm2');
class EnforceContext {
constructor(rType, pType, eType, mType) {
this.pType = pType;
this.eType = eType;
this.mType = mType;
this.rType = rType;
}
}
EnforceContext enforceContext = new EnforceContext("2");
public class EnforceContext {
private String pType;
private String eType;
private String mType;
private String rType;
public EnforceContext(String suffix) {
this.pType = "p" + suffix;
this.eType = "e" + suffix;
this.mType = "m" + suffix;
this.rType = "r" + suffix;
}
}
使用例: モデル と ポリシーを参照してください。リクエストは次のとおりです。
// Pass in a suffix as parameter to NewEnforceContext,such as 2 or 3 and it will create r2,p2,etc.
enforceContext := NewEnforceContext("2")
// You can also specify a certain type individually
enforceContext.EType = "e"
// Don't pass in EnforceContext,the default is r,p,e,m
e.Enforce("alice", "data2", "read") // true
// pass in EnforceContext
e.Enforce(enforceContext, struct{ Age int }{Age: 70}, "/data1", "read") //false
e.Enforce(enforceContext, struct{ Age int }{Age: 30}, "/data1", "read") //true
// Pass in a suffix as parameter to NewEnforceContext,such as 2 or 3 and it will create r2,p2,etc.
const enforceContext = new NewEnforceContext('2');
// You can also specify a certain type individually
enforceContext.eType = "e"
// Don't pass in EnforceContext,the default is r,p,e,m
e.Enforce("alice", "data2", "read") // true
// pass in EnforceContext
e.Enforce(enforceContext, {Age: 70}, "/data1", "read") //false
e.Enforce(enforceContext, {Age: 30}, "/data1", "read") //true
// Pass in a suffix as parameter to NewEnforceContext,such as 2 or 3 and it will create r2, p2, etc..
EnforceContext enforceContext = new EnforceContext("2");
// You can also specify a certain type individually
enforceContext.seteType("e");
// Don't pass in EnforceContext, the default is r, p, e, m
e.enforce("alice", "data2", "read"); // true
// Pass in EnforceContext
// TestEvalRule is located in https://github.com/casbin/jcasbin/blob/master/src/test/java/org/casbin/jcasbin/main/AbacAPIUnitTest.java#L56
e.enforce(enforceContext, new AbacAPIUnitTest.TestEvalRule("alice", 70), "/data1", "read"); // false
e.enforce(enforceContext, new AbacAPIUnitTest.TestEvalRule("alice", 30), "/data1", "read"); // true
Special Grammer
テキスト名を持つ唯一の演算子である を
で使用することもできます。 この演算子は、右側の配列に左側の値と同じ値が含まれているかどうかをチェックします。 等価性は、== 演算子の使用によって決定され、このライブラリは値間の型をチェックしません。 interface{}にキャストし、== との等価性をチェックできる2つの値は期待通りに動作します。 配列にはパラメータを使用できますが、 []interface{}
である必要があります。
rbac_model_matcher_using_in_op, keyget2_model と keyget_model も参照してください。
例
[request_definition]
r = sub, obj
...
[matchers]
m = r.sub.Name in (r.obj.Admins)
e.Enforce(Sub{Name: "alice"}, Obj{Name: "book", Admins: []interface{}{"alice", "bob"}})
式評価者
Casbin におけるマッチャー評価は、各言語の式評価者によって実装されています。 Casbinはそれらの力を統合し、統一されたPERM言語を提供します。 ここで提供されるすべてのモデル構文に加えて、これらの式評価者は他の言語や実装でサポートされていない可能性のある追加機能を提供することができます。 ご自身の責任でご利用ください。
各 Casbin 実装で使用される式評価者は以下のとおりです。
実装 | 言語 | 式評価者 |
---|---|---|
Casbin | Golang | https://github.com/Knetic/govaluate |
jCasbin | Java | https://github.com/killme2008/aviator |
Node-Casbin | Node.js | https://github.com/donmccurdy/expression-eval |
PHP-Casbin | PHP | https://github.com/symfony/expression-language |
PyCasbin | Python | https://github.com/danthedeckie/simpleeval |
Casbin.NET | C# | https://github.com/davideicardi/DynamicExpresso |
Casbin4D | Delphi | https://github.com/casbin4d/Casbin4D/tree/master/SourceCode/Common/Third%20Party/TExpressionParser |
casbin-rs | Rust | https://github.com/jonathandturner/rhai |
casbin-cpp | C++ | https://github.com/ArashPartow/exprtk |
note
Casbin に関するパフォーマンスの問題が発生した場合、式評価者の効率が低いことが原因であると考えられます。 速度を上げるための助言のために、Casbin または式評価者に直接問題を送信することができます。 詳細は ベンチマーク のセクションを参照してください。