🎉 Visit the new Casbin docs at: casbin.org now! 🥳
Casbin

Casbin

  • ドキュメント
  • API
  • エディター
  • IDE プラグイン
  • Single Sign-On (SSO)
  • フォーラム
  • ヘルプ
  • ブログ
  • Pricing
  • Contact Sales
  • Languages icon日本語
    • English
    • 中文
    • 한국어
    • Русский
    • Français
    • Deutsch
    • 翻訳に協力する
  • GitHub

›モデル

基本

  • 概要
  • はじめよう
  • 仕組み
  • チュートリアル

モデル

  • サポートされるモデル
  • モデルの構文
  • エフェクト
  • 関数
  • RBAC
  • RBAC with Pattern
  • ドメイン付きRBAC
  • Casbin RBAC v.s. RBAC96
  • ABAC
  • 優先モデル
  • スーパー管理者

ストレージ

  • モデル ストレージ
  • ポリシーストレージ
  • ポリシーサブセットの読み込み

拡張

  • Enforcers
  • アダプター
  • Watchers
  • 派遣者
  • ロールマネージャー
  • ミドルウェア
  • GraphQL Middlewares
  • Cloud Native Middlewares

API

  • API の概要
  • 管理API
  • RBAC API
  • Domains API による RBAC
  • RoleManager API
  • データ権限

高度な使い方

  • マルチスレッド
  • Benchmarks
  • パフォーマンス最適化
  • Kubernetes の承認
  • Envoyによるサービスメッシュの承認

管理

  • 管理者ポータル
  • カスビンサービス
  • ログとエラー処理
  • フロントエンドの使用法

エディター

  • オンラインエディター
  • IDE プラグイン

もっと見る

  • Adopters
  • コントリビューション
  • プライバシーポリシー
  • 利用規約
Translate

モデルの構文

  • モデル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-overrideACL, RBAC, その他
!some(p.eft == deny))deny-override無効にする
some((p.eft == allow)) && !some(p.eft == deny))allowand-denyAllow-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

go
Node.js
Java
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;
}
}

使用例: モデル と ポリシーを参照してください。リクエストは次のとおりです。

go
Node.js
Java
// 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 実装で使用される式評価者は以下のとおりです。

実装言語式評価者
CasbinGolanghttps://github.com/Knetic/govaluate
jCasbinJavahttps://github.com/killme2008/aviator
Node-CasbinNode.jshttps://github.com/donmccurdy/expression-eval
PHP-CasbinPHPhttps://github.com/symfony/expression-language
PyCasbinPythonhttps://github.com/danthedeckie/simpleeval
Casbin.NETC#https://github.com/davideicardi/DynamicExpresso
Casbin4DDelphihttps://github.com/casbin4d/Casbin4D/tree/master/SourceCode/Common/Third%20Party/TExpressionParser
casbin-rsRusthttps://github.com/jonathandturner/rhai
casbin-cppC++https://github.com/ArashPartow/exprtk
note

Casbin に関するパフォーマンスの問題が発生した場合、式評価者の効率が低いことが原因であると考えられます。 速度を上げるための助言のために、Casbin または式評価者に直接問題を送信することができます。 詳細は ベンチマーク のセクションを参照してください。


← サポートされるモデルエフェクト →
  • 要求の定義
  • ポリシーの定義
  • ポリシー効果
  • 交際者
  • 複数のセクションタイプ
    • Special Grammer
    • 式評価者
Casbin
Docs
Getting StartedManagement APIRBAC APIMiddlewares
Community
Who's using Casbin?Stack Overflow
Casbin          jCasbin
Node-Casbin   PHP-CasbinPyCasbin          Casbin.NETCasbin-CPP        Casbin-RS
Follow @casbinHQ
Copyright © 2022 Casbin Organization