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

アダプター

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アダプターORMCasbinMySQL, PostgreSQL, Sqlite3, SQL Server は Gorm でサポートされています
アダプターを接続ORMCasbinMySQL, MariaDB, PostgreSQL, SQLite, Gremlinベースのグラフデータベースは ent ORM でサポートされています
Beego ORMアダプターORMCasbinMySQL, PostgreSQL, Sqlite3は Beego ORMでサポートされています
SQLX アダプターORM@memweyMySQL, PostgreSQL, SQLite, Oracle は SQLX でサポートされています
Sqlx アダプターSQL@Blank-XuMySQL, PostgreSQL, SQL Server, SQLite3 は master ブランチでサポートされており、Oracle は oracle ブランチで sqlx でサポートされています。
GFORMアダプターORM@vance-liuMySQL, SQLite, PostgreSQL, Oracle, SQL Server は GoFrame ORM でサポートされています
GoFrame ORMアダプターORM@kotlin2018MySQL, SQLite, PostgreSQL, Oracle, SQL Server は 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()省略可能ストレージにポリシールールを追加
削除ポリシー()省略可能ストレージからポリシールールを削除
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 (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