アダプター
Casbinでは、ポリシーストレージはアダプタ(別名、Casbin用ミドルウェア)として実装されます。 A Casbin user can use an adapter to load policy rules from a storage (aka LoadPolicy()), or save policy rules to it (aka SavePolicy()). 重量を保つため、メインライブラリにアダプターコードは入れません。
サポートされているアダプター
Casbinアダプタの完全なリストは以下のとおりです。 新しいアダプターに対するサードパーティの貢献を歓迎します。お知らせください。このリストに記載されています:)
| アダプター | タイプ | 作成者 | AutoSave | 説明 |
|---|---|---|---|---|
| ファイルアダプター(内蔵) | ファイル | Casbin | ❌ | .CSV (カンマ区切り値) ファイル用 |
| JDBC アダプター | JDBC | Casbin | ✅ | MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server は JDBC によってサポートされています |
| Hibernateアダプター | ORM | Casbin | ✅ | Oracle, DB2, SQL Server, Sybase, MySQL, PostgreSQLは Hibernate でサポートされています |
| MyBatisアダプター | ORM | Casbin | ✅ | MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server (JDBCと同じ) は MyBatis 3 でサポートされています |
| ヒューツールアダプター | ORM | @mapleafgo | ✅ | MySQL, Oracle, PostgreSQL, SQLite は Hutool でサポートされています |
| MongoDB Adapter | NoSQL | Casbin | ✅ | MongoDB は mongodb-driver-sync でサポートされています |
| DynamoDBアダプター | NoSQL | Casbin | ❌ | Amazon DynamoDB 用 |
| Redisアダプター | KV ストア | Casbin | ✅ | Redis 用 |
| アダプター | タイプ | 作成者 | AutoSave | 説明 |
|---|---|---|---|---|
| ファイルアダプター(内蔵) | ファイル | Casbin | ❌ | .CSV (カンマ区切り値) ファイル用 |
| フィルタされたファイルアダプタ(内蔵) | ファイル | Casbin | ❌ | ポリシーサブセット読み込みサポートを持つ .CSV (カンマ区切り値) ファイルの場合 |
| ストリングアダプター(内蔵) | 文字列 | @calebfaruki | ❌ | For String |
| 基本アダプター | ネイティブ ORM | Casbin | ✅ | pg、mysql、mysql2、sqlite3、oracledb、mssqlはアダプタ自体でサポートされています |
| シーケンスアダプター | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server は Sequelize でサポートされています |
| TypeORMアダプター | ORM | Casbin | ✅ | MySQL、PostgreSQL、MariaDB、SQLite、MS SQL Server、Oracle、WebSQL、MongoDBは TypeORM でサポートされています |
| プリズマアダプター | ORM | Casbin | ✅ | MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, AWS Aurora, Azure SQL は Prisma でサポートされています |
| Knex アダプター | ORM | @sarneeh と 膝 | ✅ | MSSQL, MySQL, PostgreSQL, SQLite3, Oracleは Knex.js でサポートされています |
| Objection.js アダプター | ORM | @willsoto | ✅ | MSSQL, MySQL, PostgreSQL, SQLite3, Oracleは Objection.js でサポートされています |
| ノードPostgreSQLネイティブアダプター | SQL | @touchifyapp | ✅ | 高度なポリシーサブセット読み込みサポートと ノード-postgresで構築されたパフォーマンスの向上を備えたPostgreSQLアダプタ。 |
| Mongoose アダプター | NoSQL | elastic.io と Casbin | ✅ | MongoDB は Mongoose でサポートされています |
| Mongoose Adapter (No-Transaction) | NoSQL | minhducck | ✅ | MongoDB は Mongoose でサポートされています |
| ノードMongoDB ネイティブアダプター | NoSQL | @juicycleff | ✅ | Node MongoDB Native |
| DynamoDBアダプター | NoSQL | @fospitia | ✅ | Amazon DynamoDB 用 |
| Couchbase アダプター | NoSQL | @MarkMYoung | ✅ | Couchbase 用 |
| Redisアダプター | KV ストア | Casbin | ❌ | Redis 用 |
| Redisアダプター | KV ストア | @NandaKishorJeripothula | ❌ | Redis 用 |
| アダプター | タイプ | 作成者 | AutoSave | 説明 |
|---|---|---|---|---|
| ファイルアダプター(内蔵) | ファイル | Casbin | ❌ | .CSV (カンマ区切り値) ファイル用 |
| データベースアダプター | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server は techone/database でサポートされています |
| Zend Db アダプター | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Oracle, IBM DB2, Microsoft SQL Server, その他のPDOドライバは zend-db でサポートされています |
| Doctrine DBAL アダプタ(推奨) | ORM | Casbin | ✅ | データベーススキーマのイントロスペクションと管理のための多くの機能を備えた強力なPHPデータベース抽象レイヤー(DBAL) 。 |
| メドゥーアダプター | ORM | Casbin | ✅ | Medoo is a lightweight PHP Database Framework to Accelerate Development, supports all SQL databases, including MySQL, MSSQL, SQLite, MariaDB, PostgreSQL, Sybase, Oracle and more. |
| Laminas-db アダプター | ORM | Casbin | ✅ | MySQL、PostgreSQL、Oracle、IBM DB2、Microsoft Sql Server、PDOなど laminas-db でサポートされています |
| Zend-db アダプター | ORM | Casbin | ✅ | MySQL、PostgreSQL、Oracle、IBM DB2、Microsoft Sql Server、PDOなど は zend-db でサポートされています |
| Redisアダプター | KV ストア | @nsnake | ❌ | Redis 用 |
| アダプター | タイプ | 作成者 | AutoSave | 説明 |
|---|---|---|---|---|
| ファイルアダプター(内蔵) | ファイル | Casbin | ❌ | .CSV (カンマ区切り値) ファイル用 |
| SQLAlchemy アダプター | ORM | Casbin | ✅ | PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase は SQLAlchemy でサポートされています |
| 非同期データベースアダプター | ORM | サンピンガンテック | ✅ | PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase は データベース でサポートされています |
| Peewee アダプター | ORM | @shblhy | ✅ | PostgreSQL, MySQL, SQLite は Peewee でサポートされています |
| MongoEngine アダプター | ORM | @zhangbailong945 | ❌ | MongoDB は MongoEngine でサポートされています |
| ポニーORMアダプター | ORM | @drorvinkler | ✅ | MySQL、PostgreSQL、SQLite、Oracle、CockroachDBは ポニーORMでサポートされています |
| カメORMアダプター | ORM | @thearchitector | ✅ | PostgreSQL(>=9.4)、MySQL、MariaDB、およびSQLiteは Tortoise ORM でサポートされています |
| Couchbase アダプター | NoSQL | ScienceLogic | ✅ ( remove_filtered_policy() なし) | Couchbase 用 |
| DynamoDBアダプター | NoSQL | @abqadeer | ✅ | DynamoDB 用 |
| Pymongoアダプター | NoSQL | Casbin | ❌ | MongoDB は Pymongo でサポートされています |
| GCP Firebase アダプター | クラウド | @devrushi41 | ✅ | Google Cloud Platform Firebase |
| Async ormar Adapter | ORM | sampingantech | ✅ | PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase are supported by ormar |
| アダプター | タイプ | 作成者 | AutoSave | 説明 |
|---|---|---|---|---|
| ファイルアダプター(内蔵) | ファイル | Casbin | ❌ | .CSV (カンマ区切り値) ファイル用 |
| EFアダプター | ORM | Casbin | ❌ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, etc. は Entity Framework 6 でサポートされています |
| EFCore アダプター | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, etc. は Entity Framework Core でサポートされています |
| EFCore アダプター (.NET Core 5) | ORM | @g4dvali | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, etc. は Entity Framework Core でサポートされています |
| アダプター | タイプ | 作成者 | AutoSave | 説明 |
|---|---|---|---|---|
| ファイルアダプター(内蔵) | ファイル | Casbin | ❌ | .CSV (カンマ区切り値) ファイル用 |
| ディーゼルアダプター | ORM | Casbin | ✅ | SQLite, PostgreSQL, MySQL は ディーゼル でサポートされています |
| Sqlx アダプター | ORM | Casbin | ✅ | PostgreSQL, MySQL は Sqlx によってサポートされており、完全非同期操作が可能です。 |
| SeaORMアダプター | ORM | lingdu1234 | ✅ | PostgreSQL, MySQL は SeaORM によってサポートされており、完全に非同期で動作します |
| JSONアダプター | 文字列 | Casbin | ✅ | JSON 用 |
| YAML アダプター | 文字列 | Casbin | ✅ | YAML 用 |
| アダプター | タイプ | 作成者 | AutoSave | 説明 |
|---|---|---|---|---|
| ファイルアダプター(内蔵) | ファイル | Casbin | ❌ | .CSV (カンマ区切り値) ファイル用 |
| 連続アダプター | ORM | CasbinRuby | ✅ | ADO, Amagalite, IBM_DB, JDBC, MySQL, MySQL2, ODBC, Oracle, PostgreSQL, SQLAnywhere, SQLite3, および TinyTDS がサポートしています シーケンス |
| アダプター | タイプ | 作成者 | AutoSave | 説明 |
|---|---|---|---|---|
| ファイルアダプター(内蔵) | ファイル | Casbin | ❌ | .CSV (カンマ区切り値) ファイル用 |
| メモリー・アダプター(内蔵) | メモリ | Casbin | ❌ | メモリ用 |
| Fluent アダプター | ORM | Casbin | ✅ | PostgreSQL, SQLite, MySQL, MongoDB は Fluent でサポートされています |
| アダプター | タイプ | 作成者 | AutoSave | 説明 |
|---|---|---|---|---|
| ファイルアダプター(内蔵) | ファイル | Casbin | ❌ | .CSV (カンマ区切り値) ファイル用 |
| フィルタされたファイルアダプタ(内蔵) | ファイル | Casbin | ❌ | ポリシーサブセット読み込みサポートを持つ .CSV (カンマ区切り値) ファイルの場合 |
| LuaSQLアダプター | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite3 は LuaSQL でサポートされています |
| 4DaysORMアダプター | ORM | Casbin | ✅ | MySQL, SQLite3は 4DaysORMでサポートされています |
note
casbin.NewEnforcer()が明示的または暗黙的なアダプタで呼び出された場合、ポリシーは自動的に読み込まれます。e.LoadPolicy()を呼び出して、ポリシーのルールをストレージから再読み込みできます。- アダプターが
自動保存機能をサポートしていない場合。 ポリシーを追加または削除すると、ポリシールールはストレージに自動的に保存されません。 すべてのポリシールールを保存するには、SavePolicy()を手動で呼び出す必要があります。
例
ここではいくつかの例を示します:
ファイルアダプター(内蔵)
以下は、組み込みのファイルアダプターからエンフォーサーを初期化する方法です。
import "github.com/casbin/casbin"
e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
use Casbin\Enforcer;
$e = new Enforcer('examples/basic_model.conf', 'examples/basic_policy.csv');
use casbin::prelude::*;
let mut e = Enforcer::new("examples/basic_model.conf", "examples/basic_policy.csv").await?;
これは以下と同じです。
import (
"github.com/casbin/casbin"
"github.com/casbin/file-adapter"
)
a := fileadapter.NewAdapter("examples/basic_policy.csv")
e := casbin.NewEnforcer("examples/basic_model.conf", a)
use Casbin\Enforcer;
use Casbin\Persist\Adapters\FileAdapter;
$a = new FileAdapter('examples/basic_policy.csv');
$e = new Enforcer('examples/basic_model.conf', $a);
use casbin::prelude::*;
let a = FileAdapter::new("examples/basic_policy.csv");
let e = Enforcer::new("examples/basic_model.conf", a).await?;
MySQL adapter
以下に、MySQL データベースからエンフォーサーを初期化する方法を示します。 127.0.0.1:3306のMySQL DBにrootと空白のパスワードで接続します。
import (
"github.com/casbin/casbin"
"github.com/casbin/mysql-adapter"
)
a := mysqladapter.NewAdapter("mysql", "root:@tcp(127.0.1:3306)/")
e := casbin.NewEnforcer("examples/basic_model.conf", a)
// https://github.com/casbin-rs/diesel-adapter
// make sure you activate feature `mysql`
use casbin::prelude::*;
use diesel_adapter::{ConnOptions, DieselAdapter};
let mut conn_opts = ConnOptions::default();
conn_opts
.set_hostname("127.0.0.1")
.set_port(3306)
.set_host("127.0.0.1:3306") // overwrite hostname, port config
.set_database("casbin")
.set_auth("casbin_rs", "casbin_rs");
let a = DieselAdapter::new(conn_opts)?;
let mut e = Enforcer::new("examples/basic_model.conf", a).await?;
// https://github.com/php-casbin/dbal-adapter
use Casbin\Enforcer;
use CasbinAdapter\DBAL\Adapter as DatabaseAdapter;
$config = [
// Either 'driver' with one of the following values:
// pdo_mysql,pdo_sqlite,pdo_pgsql,pdo_oci (unstable),pdo_sqlsrv,pdo_sqlsrv,
// mysqli,sqlanywhere,sqlsrv,ibm_db2 (unstable),drizzle_pdo_mysql
'driver' => 'pdo_mysql',
'host' => '127.0.0.1',
'dbname' => 'test',
'user' => 'root',
'password' => '',
'port' => '3306',
];
$a = DatabaseAdapter::newAdapter($config);
$e = new Enforcer('examples/basic_model.conf', $a);
独自のストレージアダプターを使用する
以下のような独自のアダプターを使用できます。
import (
"github.com/casbin/casbin"
"github.com/your-username/your-repo"
)
a := yourpackage.NewAdapter(params)
e := casbin.NewEnforcer("examples/basic_model.conf", a)
異なるアダプター間で移行/変換
アダプターを A から Bに変換したい場合は、次のようにします。
- A からメモリへのポリシーの読み込み
e, _ := NewEnforcer(m, A)
または
e.SetAdapter(A)
e.LoadPolicy()
アダプターを A から B に変換します。
e.SetAdapter(B)Save policy from memory to B
e.LoadPolicy()
Load/Save at run-time
You may also want to reload the model, reload the policy or save the policy after initialization:
// Reload the model from the model CONF file.
e.LoadModel()
// ファイル/データベースからポリシーを再読み込みします。
e.LoadPolicy()
// 現在のポリシー(通常はCasbin APIで変更後)をファイル/データベースに保存します。
e.SavePolicy()
AutoSave
アダプターには 自動保存 という機能があります。 アダプターが 自動保存をサポートしている場合 ストレージに単一のポリシールールを追加したり、ストレージから単一のポリシールールを削除したりすることができます。 これは SavePolicy()とは違います 後者は、ストレージ内のすべてのポリシールールを削除し、Casbinエンフォーサーからストレージにすべてのポリシールールを保存するためです。 したがって、ポリシールールの数が多い場合、パフォーマンスの問題が発生する可能性があります。
アダプターが Auto-Saveをサポートしている場合、 Enforcer.EnableAutoSave() 関数を使用してこのオプションを切り替えることができます。 このオプションはデフォルトで有効になっています(アダプターがサポートしている場合)。
note
自動保存機能は任意です。 アダプターは実装するかどうかを選択できます。自動保存は、エンフォーサーが使用するアダプターがサポートしている場合にのみ動作します。自動保存がアダプターによってサポートされているかどうかについては、上のアダプターリストの自動保存列を参照してください。
自動保存 の使い方の例を以下に示します。
import (
"github.com/casbin/casbin"
"github.com/casbin/xorm-adapter"
_ "github.com/go-sql-driver/mysql"
)
// デフォルトでは、AutoSave オプションがエンフォーサーに対して有効になっています。
a := xormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/")
e := casbin.NewEnforcer("examples/basic_model.conf", a)
// 自動保存オプションを無効にします。
e.EnableAutoSave(false)
// Because AutoSave is disabled, the policy change only affects the policy in Casbin enforcer,
// it doesn't affect the policy in the storage.
e.AddPolicy(...)
e.RemovePolicy(...)
// Enable the AutoSave option.
e.EnableAutoSave(true)
// Because AutoSave is enabled, the policy change not only affects the policy in Casbin enforcer,
// but also affects the policy in the storage.
e.AddPolicy(...)
e.RemovePolicy(...)
詳細については、以下を参照してください: https://github.com/casbin/xorm-adapter/blob/master/adapter_test.go
アダプターの書き込み方法
All adapters should implement the Adapter interface by providing at least two mandatory methods:LoadPolicy(model model.Model) error and SavePolicy(model model.Model) error.
他の3つの関数は任意です。 アダプターが Auto-Save 機能をサポートしている場合は、実装する必要があります。
| 方法 | タイプ | 説明 |
|---|---|---|
| LoadPolicy() | mandatory | ストレージからすべてのポリシールールを読み込む |
| SavePolicy() | mandatory | すべてのポリシールールをストレージに保存 |
| AddPolicy() | 省略可能 | ストレージにポリシールールを追加 |
| 削除ポリシー() | 省略可能 | ストレージからポリシールールを削除 |
| RemoveFilterPolicy() | 省略可能 | ストレージからフィルタに一致するポリシールールを削除 |
note
アダプターが Auto-Saveをサポートしていない場合は、3 つのオプション関数の空の実装を提供する必要があります。 Golangの例を以下に示します:
// AddPolicy がストレージにポリシールールを追加します。
func (a *Adapter) AddPolicy(sec string, ptype string, rule []string) error {
return errors.New("not implemented")
}
// RemovePolicy removes a policy rule from the storage.
func (a *Adapter) RemovePolicy(sec string, ptype string, rule []string) error {
return errors.New("not implemented")
}
// RemoveFilteredPolicy removes policy rules that match the filter from the storage.
func (*Adapter) RemoveFilteredPolicy(sec文字列, ptype文字列, fieldIndex int, fieldValues ...string) error {
return errors.New("not implemented")
}
Casbin エンフォーサーは、これらの 3 つのオプション関数を呼び出すときに、 実装されていない エラーを無視します。
アダプターの書き方についての詳細があります。
- データ構造 アダプターは、 ****** 6列以上の読み取りをサポートする必要があります。
- データベース名 デフォルトのデータベース名は
casbinでなければなりません。 - テーブル名 デフォルトのテーブル名は
casbin_ruleでなければなりません。 - 型の列。 この列の名前は
p_typeまたはP_typeの代わりにptypeでなければなりません。 - テーブル定義は
(id int primary key, ptype varchar, v0 varchar, v1 varchar, v2 varchar, v3 varchar, v4 varchar, v5 varchar)でなければなりません。 - ユニークなキーインデックスは、列
ptype,v0,v1,v2,v3,v4,v5上に構築する必要があります。 LoadFilteredPolicyパラメータとしてフィルターが必要です。 フィルタは次のようなものでなければなりません。 json { "p":[ "alice" ], [ "bob" ] , "g":[ [ "", "book_group" ], [ "", "pen_group" ] ], "g2":[ [ "alice" ] ] }
誰がDBを作成する責任がありますか?
慣例として、 アダプターが存在しない場合は、自動的に カビン という名前のデータベースを作成し、ポリシーストレージに使用する必要があります。 参照実装として Xorm アダプターを使用してください: https://github.com/casbin/xorm-adapter