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

アダプター

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アダプタの完全なリストは以下のとおりです。 新しいアダプターに対するサードパーティの貢献を歓迎します。お知らせください。このリストに記載されています:)

Adapterタイプ作成者AutoSave説明
ファイルアダプター(内蔵)ファイルCasbin.CSV (カンマ区切り値) ファイル用
フィルタされたファイルアダプタ(内蔵)ファイル@faceless-saintポリシーサブセット読み込みサポートを持つ .CSV (カンマ区切り値) ファイルの場合
SQL アダプターSQL@Blank-XuMySQL, PostgreSQL, SQL Server, SQLite3 は master ブランチでサポートされており、Oracle は oracle ブランチで database/sql でサポートされています。
XormアダプターORMCasbinMySQL、PostgreSQL、TiDB、SQLite、SQL Server、Oracle は Xorm でサポートされています
GORM AdapterORMCasbinMySQL, PostgreSQL, Sqlite3, SQL Server are supported by GORM
GORM Adapter ExORMCasbinMySQL, PostgreSQL, Sqlite3, SQL Server are supported by GORM
アダプターを接続ORMCasbinMySQL, MariaDB, PostgreSQL, SQLite, Gremlinベースのグラフデータベースは ent ORM でサポートされています
Beego ORMアダプターORMCasbinMySQL, PostgreSQL, Sqlite3は Beego ORMでサポートされています
SQLX アダプターORM@memweyMySQL, PostgreSQL, SQLite, Oracle は SQLX でサポートされています
Sqlx アダプターORM@Blank-XuMySQL, PostgreSQL, SQL Server, SQLite3 は master ブランチでサポートされており、Oracle は oracle ブランチで sqlx でサポートされています。
GFORMアダプターORM@vance-liuMySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
GoFrame ORMアダプターORM@kotlin2018MySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
gf-adapterORM@zcycMySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
Gdb AdapterORM@jxo-meMySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
GoFrame V2 AdapterORM@hailazMySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
フィルタされたPostgreSQLアダプターSQLCasbinPostgreSQL
フィルタされた pgx アダプターSQL@pckhoiPostgreSQL は pgx でサポートされています
PostgreSQL アダプターSQL@cychiuaePostgreSQL
RQLite アダプターSQLEDOMO システムRQLite
MongoDB AdapterNoSQLCasbinMongoDB Go Driver に基づく MongoDB
RethinkDB アダプターNoSQL@adityapandey9RethinkDB
Cassandra アダプターNoSQLCasbinApache Cassandra DB
DynamoDBアダプターNoSQLHOOQAmazon DynamoDB
DynacasbinNoSQLNewbMiaoAmazon DynamoDB
ArangoDB アダプターNoSQL@adamwasilaArangoDB
Amazon S3 アダプタークラウドSolutoMinioAmazon S3
Azure Cosmos DB アダプタークラウド@spacycoderMicrosoft Azure Cosmos DB
GCP Firestore Adapterクラウド@reedomGoogle Cloud Platform Firestore
GCP クラウドストレージアダプタークラウドquramiGoogle Cloud Platform Cloud Storage
GCP クラウドスパナアダプタークラウド@flowerinthenightGoogle Cloud Platform Spanner
領事アダプターKV ストア@ankitm123HashiCorp Consul
Redisアダプター (Redigo)KV ストアCasbinRedis
Redisアダプター (go-redis)KV ストア@mlsenRedis
Etcd アダプターKV ストア@sebastianliuetcd
BoltDB アダプターKV ストア@spezaボルト
ボルトアダプターKV ストア@wirepボルト
BadgerDB アダプターKV ストア@initsBadgerDB
Protobuf アダプターストリームCasbinGoogleプロトコルバッファー
JSONアダプター文字列CasbinJSON
ストリングアダプター文字列@qiangmzsxFor String
HTTP ファイルアダプターHTTP@h4ckednekohttp.FileSystem
FileSystem アダプターファイル@nauconfs.FSembed.FS の場合
note
  1. casbin.NewEnforcer() が明示的または暗黙的なアダプタで呼び出された場合、ポリシーは自動的に読み込まれます。
  2. e.LoadPolicy() を呼び出して、ポリシーのルールをストレージから再読み込みできます。
  3. アダプターが 自動保存 機能をサポートしていない場合。 ポリシーを追加または削除すると、ポリシールールはストレージに自動的に保存されません。 すべてのポリシールールを保存するには、 SavePolicy() を手動で呼び出す必要があります。

ここではいくつかの例を示します:

ファイルアダプター(内蔵)

以下は、組み込みのファイルアダプターからエンフォーサーを初期化する方法です。

import "github.com/casbin/casbin"

e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")

これは以下と同じです。

import (
"github.com/casbin/casbin"
"github.com/casbin/casbin/file-adapter"
)

a := fileadapter.NewAdapter("examples/basic_policy.csv")
e := casbin.NewEnforcer("examples/basic_model.conf", a)

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.0.1:3306)/")
e := casbin.NewEnforcer("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に変換したい場合は、次のようにします。

  1. A からメモリへのポリシーの読み込み

    e, _ := NewEnforcer(m, A)

    または

    e.SetAdapter(A)
    e.LoadPolicy()
  2. アダプターをAからBに変換する

    e.SetAdapter(B)
  3. ポリシーをメモリからBに保存

    e.LoadPolicy()

実行時に読み込み/保存

モデルを再読み込みしたり、ポリシーを再読み込みしたり、初期化後にポリシーを保存したりすることもできます。

// CONFファイルからモデルをリロードします。
e.LoadModel()

// ファイル/データベースからポリシーを再読み込みします。
e.LoadPolicy()

// 現在のポリシー(通常はCasbin APIで変更後)をファイル/データベースに保存します。
e.SavePolicy()

AutoSave

アダプターには 自動保存 という機能があります。 アダプターが 自動保存をサポートしている場合 ストレージに単一のポリシールールを追加したり、ストレージから単一のポリシールールを削除したりすることができます。 これは SavePolicy()とは違います 後者は、ストレージ内のすべてのポリシールールを削除し、Casbinエンフォーサーからストレージにすべてのポリシールールを保存するためです。 したがって、ポリシールールの数が多い場合、パフォーマンスの問題が発生する可能性があります。

アダプターが Auto-Saveをサポートしている場合、 Enforcer.EnableAutoSave() 関数を使用してこのオプションを切り替えることができます。 このオプションはデフォルトで有効になっています(アダプターがサポートしている場合)。

note
  1. 自動保存 機能は任意です。 アダプターは実装するかどうかを選択できます。
  2. 自動保存 は、エンフォーサーが使用するアダプターがサポートしている場合にのみ動作します。
  3. 自動保存 がアダプターによってサポートされているかどうかについては、上のアダプターリストの 自動保存 列を参照してください。

自動保存 の使い方の例を以下に示します。

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()省略可能ストレージにポリシールールを追加
削除ポリシー()optionalストレージからポリシールールを削除
RemoveFilterPolicy()optionalストレージからフィルタに一致するポリシールールを削除
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 (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, 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 はパラメータとして フィルター を必要とします。 フィルタは次のようなものでなければなりません。
    {
    "p":[ [ "alice" ], [ "bob" ] ],
    "g":[ [ "", "book_group" ], [ "", "pen_group" ] ],
    "g2":[ [ "alice" ] ]
    }

誰がDBを作成する責任がありますか?

慣例として、 アダプターが存在しない場合は、自動的に カビン という名前のデータベースを作成し、ポリシーストレージに使用する必要があります。 参照実装として Xorm アダプターを使用してください: https://github.com/casbin/xorm-adapter