Adapters
В Casbin хранение политики реализовано в виде адаптера (также известного как промежуточное ПО для Casbin). Пользователь Casbin может использовать адаптер для загрузки правил политики из хранилища (также известного как LoadPolicy()), или сохранить правила политики в нем (также известное как SavePolicy()). Чтобы сохранить легкость, мы не помещаем код адаптера в основную библиотеку.
Поддерживаемые адаптеры
Полный список адаптеров Casbin представлен ниже. Любой вклад от сторонних разработчиков в новый адаптер приветствуется, пожалуйста, сообщите нам, и мы добавим его в этот список:
- Go
- Java
- Node.js
- PHP
- Python
- .NET
- Rust
- Ruby
- Swift
- Lua
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| Filtered File Adapter (built-in) | File | @faceless-saint | ❌ | For .CSV (Comma-Separated Values) files with policy subset loading support |
| SQL Adapter | SQL | @Blank-Xu | ✅ | MySQL, PostgreSQL, SQL Server, SQLite3 are supported in master branch and Oracle is supported in oracle branch by database/sql |
| Xorm Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, TiDB, SQLite, SQL Server, Oracle are supported by Xorm |
| GORM Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, Sqlite3, SQL Server are supported by GORM |
| GORM Adapter Ex | ORM | Casbin | ✅ | MySQL, PostgreSQL, Sqlite3, SQL Server are supported by GORM |
| Ent Adapter | ORM | Casbin | ✅ | MySQL, MariaDB, PostgreSQL, SQLite, Gremlin-based graph databases are supported by ent ORM |
| Beego ORM Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, Sqlite3 are supported by Beego ORM |
| SQLX Adapter | ORM | @memwey | ✅ | MySQL, PostgreSQL, SQLite, Oracle are supported by SQLX |
| Sqlx Adapter | ORM | @Blank-Xu | ✅ | MySQL, PostgreSQL, SQL Server, SQLite3 are supported in master branch and Oracle is supported in oracle branch by sqlx |
| GF ORM Adapter | ORM | @vance-liu | ✅ | MySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM |
| GoFrame ORM Adapter | ORM | @kotlin2018 | ✅ | MySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM |
| gf-adapter | ORM | @zcyc | ✅ | MySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM |
| Gdb Adapter | ORM | @jxo-me | ✅ | MySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM |
| GoFrame V2 Adapter | ORM | @hailaz | ✅ | MySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM |
| Bun Adapter | ORM | @JunNishimura | ✅ | MySQL, SQLite, PostgreSQL, SQL Server are supported by Bun ORM |
| Filtered PostgreSQL Adapter | SQL | Casbin | ✅ | For PostgreSQL |
| Filtered pgx Adapter | SQL | @pckhoi | ✅ | PostgreSQL is supported by pgx |
| Pgx Adapter | SQL | @gtoxlili | ✅ | PostgreSQL is supported by pgx, supports customizable column count |
| PostgreSQL Adapter | SQL | @cychiuae | ✅ | For PostgreSQL |
| RQLite Adapter | SQL | EDOMO Systems | ✅ | For RQLite |
| MongoDB Adapter | NoSQL | Casbin | ✅ | For MongoDB based on MongoDB Go Driver |
| RethinkDB Adapter | NoSQL | @adityapandey9 | ✅ | For RethinkDB |
| Cassandra Adapter | NoSQL | Casbin | ❌ | For Apache Cassandra DB |
| DynamoDB Adapter | NoSQL | HOOQ | ❌ | For Amazon DynamoDB |
| Dynacasbin | NoSQL | NewbMiao | ✅ | For Amazon DynamoDB |
| ArangoDB Adapter | NoSQL | @adamwasila | ✅ | For ArangoDB |
| Amazon S3 Adapter | Cloud | Soluto | ❌ | For Minio and Amazon S3 |
| Go CDK Adapter | Cloud | @bartventer | ✅ | Adapter based on Go Cloud Dev Kit that supports: Amazon DynamoDB, Azure CosmosDB, GCP Firestore, MongoDB, In-Memory |
| Azure Cosmos DB Adapter | Cloud | @spacycoder | ✅ | For Microsoft Azure Cosmos DB |
| GCP Firestore Adapter | Cloud | @reedom | ❌ | For Google Cloud Platform Firestore |
| GCP Cloud Storage Adapter | Cloud | qurami | ❌ | For Google Cloud Platform Cloud Storage |
| GCP Cloud Spanner Adapter | Cloud | @flowerinthenight | ✅ | For Google Cloud Platform Cloud Spanner |
| Consul Adapter | KV store | @ankitm123 | ❌ | For HashiCorp Consul |
| Redis Adapter (Redigo) | KV store | Casbin | ✅ | For Redis |
| Redis Adapter (go-redis) | KV store | @mlsen | ✅ | For Redis |
| Etcd Adapter | KV store | @sebastianliu | ❌ | For etcd |
| BoltDB Adapter | KV store | @speza | ✅ | For Bolt |
| Bolt Adapter | KV store | @wirepair | ❌ | For Bolt |
| BadgerDB Adapter | KV store | @inits | ✅ | For BadgerDB |
| Protobuf Adapter | Stream | Casbin | ❌ | For Google Protocol Buffers |
| JSON Adapter | String | Casbin | ❌ | For JSON |
| String Adapter | String | @qiangmzsx | ❌ | For String |
| HTTP File Adapter | HTTP | @h4ckedneko | ❌ | For http.FileSystem |
| FileSystem Adapter | File | @naucon | ❌ | For fs.FS and embed.FS |
| NATS JetStream Adapter | KV store | grepplabs | ✅ | For NATS JetStream |
| Kubernetes Adapter | Cloud | grepplabs | ✅ | For Kubernetes |
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| JDBC Adapter | JDBC | Casbin | ✅ | MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server are supported by JDBC |
| Hibernate Adapter | ORM | Casbin | ✅ | Oracle, DB2, SQL Server, Sybase, MySQL, PostgreSQL are supported by Hibernate |
| MyBatis Adapter | ORM | Casbin | ✅ | MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server (the same as JDBC) are supported by MyBatis 3 |
| Hutool Adapter | ORM | @mapleafgo | ✅ | MySQL, Oracle, PostgreSQL, SQLite are supported by Hutool |
| MongoDB Adapter | NoSQL | Casbin | ✅ | MongoDB is supported by mongodb-driver-sync |
| DynamoDB Adapter | NoSQL | Casbin | ❌ | For Amazon DynamoDB |
| Redis Adapter | KV store | Casbin | ✅ | For Redis |
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| Filtered File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files with policy subset loading support |
| String Adapter (built-in) | String | @calebfaruki | ❌ | For String |
| Basic Adapter | Native ORM | Casbin | ✅ | pg, mysql, mysql2, sqlite3, oracledb, mssql are supported by the adapter itself |
| Sequelize Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server are supported by Sequelize |
| TypeORM Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL, MongoDB are supported by TypeORM |
| Prisma Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, AWS Aurora, Azure SQL are supported by Prisma |
| Knex Adapter | ORM | knex | ✅ | MSSQL, MySQL, PostgreSQL, SQLite3, Oracle are supported by Knex.js |
| Objection.js Adapter | ORM | @willsoto | ✅ | MSSQL, MySQL, PostgreSQL, SQLite3, Oracle are supported by Objection.js |
| MikroORM Adapter | ORM | @baisheng | ✅ | MongoDB, MySQL, MariaDB, PostgreSQL, SQLite are supported by MikroORM |
| Node PostgreSQL Native Adapter | SQL | @touchifyapp | ✅ | PostgreSQL adapter with advanced policy subset loading support and improved performances built with node-postgres. |
| Mongoose Adapter | NoSQL | elastic.io and Casbin | ✅ | MongoDB is supported by Mongoose |
| Mongoose Adapter (No-Transaction) | NoSQL | minhducck | ✅ | MongoDB is supported by Mongoose |
| Node MongoDB Native Adapter | NoSQL | NathanBhanji | ✅ | For Node MongoDB Native |
| Node MongoDB Native Adapter | NoSQL | @juicycleff | ✅ | For Node MongoDB Native |
| DynamoDB Adapter | NoSQL | @fospitia | ✅ | For Amazon DynamoDB |
| Couchbase Adapter | NoSQL | @MarkMYoung | ✅ | For Couchbase |
| Redis Adapter | KV store | Casbin | ❌ | For Redis |
| Redis Adapter | KV store | @NandaKishorJeripothula | ❌ | For Redis |
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| Database Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server are supported by techone/database |
| Zend Db Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Oracle, IBM DB2, Microsoft SQL Server, Other PDO Driver are supported by zend-db |
| Doctrine DBAL Adapter (Recommend) | ORM | Casbin | ✅ | Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management. |
| Medoo Adapter | 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 Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, Oracle, IBM DB2, Microsoft SQL Server, PDO, etc. are supported by laminas-db |
| Zend-db Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, Oracle, IBM DB2, Microsoft SQL Server, PDO, etc. are supported by zend-db |
| ThinkORM Adapter (ThinkPHP) | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Oracle, Microsoft SQL Server, MongoDB are supported by ThinkORM |
| Redis Adapter | KV store | @nsnake | ❌ | For Redis |
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| Django ORM Adapter | ORM | Casbin | ✅ | PostgreSQL, MariaDB, MySQL, Oracle, SQLite, IBM DB2, Microsoft SQL Server, Firebird, ODBC are supported by Django ORM |
| SQLObject Adapter | ORM | Casbin | ✅ | PostgreSQL, MySQL, SQLite, Microsoft SQL Server, Firebird, Sybase, MAX DB, pyfirebirdsql are supported by SQLObject |
| SQLAlchemy Adapter | ORM | Casbin | ✅ | PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase are supported by SQLAlchemy |
| Async SQLAlchemy Adapter | ORM | Casbin | ✅ | PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase are supported by SQLAlchemy |
| Async Databases Adapter | ORM | Casbin | ✅ | PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase are supported by Databases |
| Peewee Adapter | ORM | @shblhy | ✅ | PostgreSQL, MySQL, SQLite are supported by Peewee |
| MongoEngine Adapter | ORM | @zhangbailong945 | ❌ | MongoDB is supported by MongoEngine |
| Pony ORM Adapter | ORM | @drorvinkler | ✅ | MySQL, PostgreSQL, SQLite, Oracle, CockroachDB are supported by Pony ORM |
| Tortoise ORM Adapter | ORM | @thearchitector | ✅ | PostgreSQL (>=9.4), MySQL, MariaDB, and SQLite are supported by Tortoise ORM |
| Async Ormar Adapter | ORM | @shepilov-vladislav | ✅ | PostgreSQL, MySQL, SQLite are supported by Ormar |
| SQLModel Adapter | ORM | @shepilov-vladislav | ✅ | PostgreSQL, MySQL, SQLite are supported by SQLModel |
| Couchbase Adapter | NoSQL | ScienceLogic | ✅ (without remove_filtered_policy()) | For Couchbase |
| DynamoDB Adapter | NoSQL | @abqadeer | ✅ | For DynamoDB |
| Pymongo Adapter | NoSQL | Casbin | ❌ | MongoDB is supported by Pymongo |
| Redis Adapter | KV store | Casbin | ✅ | For Redis |
| GCP Firebase Adapter | Cloud | @devrushi41 | ✅ | For Google Cloud Platform Firebase |
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| EF Adapter | ORM | Casbin | ❌ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, etc. are supported by Entity Framework 6 |
| EFCore Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, etc. are supported by Entity Framework Core |
| Linq2DB Adapter | ORM | @Tirael | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, Access, Firebird, Sybase, etc. are supported by linq2db |
| Azure Cosmos DB Adapter | Cloud | @sagarkhandelwal | ✅ | For Microsoft Azure Cosmos DB |
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| Diesel Adapter | ORM | Casbin | ✅ | SQLite, PostgreSQL, MySQL are supported by Diesel |
| Sqlx Adapter | ORM | Casbin | ✅ | PostgreSQL, MySQL are supported by Sqlx with fully asynchronous operation |
| SeaORM Adapter | ORM | @lingdu1234 | ✅ | PostgreSQL, MySQL, SQLite are supported by SeaORM with fully asynchronous operation |
| SeaORM Adapter | ORM | @ZihanType | ✅ | PostgreSQL, MySQL, SQLite are supported by SeaORM with fully asynchronous operation |
| Rbatis Adapter | ORM | rbatis | ✅ | MySQL, PostgreSQL, SQLite, SQL Server, MariaDB, TiDB, CockroachDB, Oracle are supported by Rbatis |
| DynamodDB Adapter | NoSQL | @fospitia | ✅ | For Amazon DynamoDB |
| MongoDB Adapter | MongoDB | @wangjun861205 | ✅ | For MongoDB |
| JSON Adapter | String | Casbin | ✅ | For JSON |
| YAML Adapter | String | Casbin | ✅ | For YAML |
| String Adapter | String | Casbin | ❌ | For String |
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| Sequel Adapter | ORM | CasbinRuby | ✅ | ADO, Amalgalite, IBM_DB, JDBC, MySQL, Mysql2, ODBC, Oracle, PostgreSQL, SQLAnywhere, SQLite3, and TinyTDS are supported by Sequel |
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| Memory Adapter (built-in) | Memory | Casbin | ❌ | For memory |
| Fluent Adapter | ORM | Casbin | ✅ | PostgreSQL, SQLite, MySQL, MongoDB are supported by Fluent |
| Adapter | Type | Author | AutoSave | Description |
|---|---|---|---|---|
| File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files |
| Filtered File Adapter (built-in) | File | Casbin | ❌ | For .CSV (Comma-Separated Values) files with policy subset loading support |
| LuaSQL Adapter | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite3 are supported by LuaSQL |
| 4DaysORM Adapter | ORM | Casbin | ✅ | MySQL, SQLite3 are supported by 4DaysORM |
| OpenResty Adapter | ORM | @tom2nonames | ✅ | MySQL, PostgreSQL are supported by it |
- Если вызывается
casbin.NewEnforcer()с явным или неявным адаптером, политика будет загружена автоматически. - Вы можете вызвать
e.LoadPolicy()для перезагрузки правил политики из хранилища. - Если адаптер не поддерживает функцию
Auto-Save, правила политики не могут быть автоматически сохранены обратно в хранилище при добавлении или удалении политик. Вам придется вызватьSavePolicy()вручную, чтобы сохранить все правила политики.
Примеры
Здесь мы предоставляем несколько примеров:
Адаптер файлов (встроенный)
Ниже показано, как инициализировать принудительное выполнение из встроенного адаптера файлов:
- Go
- PHP
- Rust
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?;
Это то же самое, что и:
- Go
- PHP
- Rust
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)
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
Ниже показано, как инициализировать принудительное выполнение из базы данных MySQL. он подключается к MySQL DB на 127.0.0.1:3306 с root и пустым паролем.
- Go
- Rust
- PHP
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)
// 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, вы можете сделать это так:
1.Загрузите политику из A в память
e, _ := NewEnforcer(m, A)
или
e.SetAdapter(A)
e.LoadPolicy()
2.конвертируйте ваш адаптер из A в B
e.SetAdapter(B)
3.Сохраните политику из памяти в B
e.SavePolicy()
Загрузка/Сохранение во время выполнения
Вы также можете захотеть перезагрузить модель, перезагрузить политику или сохранить политику после инициализации:
// Reload the model from the model CONF file.
e.LoadModel()
// Reload the policy from file/database.
e.LoadPolicy()
// Save the current policy (usually after changed with Casbin API) back to file/database.
e.SavePolicy()
AutoSave
Существует функция под названием Auto-Save для адаптеров. Когда адаптер поддерживает Auto-Save, это означает, что он может поддерживать добавление одного правила политики в хранилище или удаление одного правила политики из хранилища. Это отличается от SavePolicy(), потому что последний удалит все правила политики в хранилище и сохранит все правила политики из Casbin enforcer в хранилище. Таким образом, могут возникнуть проблемы с производительностью, когда количество правил политики велико.
Когда адаптер поддерживает Auto-Save, вы можете переключить эту опцию с помощью функции Enforcer.EnableAutoSave(). Опция включена по умолчанию (если адаптер ее поддерживает).
- Функция
Auto-Saveявляется необязательной. Адаптер может выбрать, реализовать ее или нет. Auto-Saveработает только для Casbin enforcer, когда адаптер, который использует enforcer, поддерживает его.- Смотрите столбец
AutoSaveв приведенном выше списке адаптеров, чтобы увидеть, поддерживает лиAuto-Saveадаптер.
Вот пример использования Auto-Save:
import (
"github.com/casbin/casbin"
"github.com/casbin/xorm-adapter"
_ "github.com/go-sql-driver/mysql"
)
// By default, the AutoSave option is enabled for an enforcer.
a := xormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/")
e := casbin.NewEnforcer("examples/basic_model.conf", a)
// Disable the AutoSave option.
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
Как написать адаптер
Все адаптеры должны реализовать интерфейс Adapter, предоставив как минимум два обязательных метода: LoadPolicy(model model.Model) error и SavePolicy(model model.Model) error.
Остальные три функции являются необязательными. Они должны быть реализованы, если адаптер поддерживает функцию Auto-Save.
| Метод | Тип | Описание |
|---|---|---|
| LoadPolicy() | обязательный | Загрузить все правила политики из хранилища |
| SavePolicy() | обязательный | Сохранить все правила политики в хранилище |
| AddPolicy() | необязательный | Добавить правило политики в хранилище |
| RemovePolicy() | необязательный | Удалить правило политики из хранилища |
| RemoveFilteredPolicy() | необязательный | Удалить правила политики, которые соответствуют фильтру, из хранилища |
Если адаптер не поддерживает Auto-Save, он должен предоставить пустую реализацию для трех необязательных функций. Вот пример для Golang:
// AddPolicy adds a policy rule to the storage.
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 enforcer проигнорирует ошибку not implemented при вызове этих трех необязательных функций.
Здесь подробности о том, как написать адаптер.
- Структура данных. Адаптер должен поддерживать чтение как минимум шести столбцов.
- Имя базы данных. Имя базы данных по умолчанию должно быть
casbin. - Имя таблицы. Имя таблицы по умолчанию должно быть
casbin_rule. - Столбец Ptype. Имя этого столбца должно быть
ptype, а не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требуетfilterв качестве параметра. Фильтр должен быть таким.
{
"p": ["", "domain1"],
"g": ["", "", "domain1"]
}
Кто отвечает за создание БД?
По соглашению, адаптер должен иметь возможность автоматически создавать базу данных с именем casbin, если она не существует, и использовать ее для хранения политики. Пожалуйста, используйте адаптер Xorm в качестве референсной реализации: https://github.com/casbin/xorm-adapter
Update Adapter
The UpdateAdapter interface extends the basic Adapter interface to support updating policies directly in the storage. This is more efficient than removing and re-adding policies when you need to modify existing rules.
An adapter that implements the UpdateAdapter interface should provide the following methods:
| Method | Type | Description |
|---|---|---|
| UpdatePolicy() | optional | Update a single policy rule in the storage |
| UpdatePolicies() | optional | Update multiple policy rules in the storage |
| UpdateFilteredPolicies() | optional | Update policy rules that match the filter in the storage |
Пример
Here's an example of using the update adapter methods:
import (
"github.com/casbin/casbin/v2"
"github.com/casbin/gorm-adapter/v3"
)
a, _ := gormadapter.NewAdapter("mysql", "root:@tcp(127.0.0.1:3306)/")
e, _ := casbin.NewEnforcer("examples/rbac_model.conf", a)
// Update a single policy
// Change: p, alice, data1, read -> p, alice, data1, write
e.UpdatePolicy(
[]string{"alice", "data1", "read"},
[]string{"alice", "data1", "write"},
)
// Update multiple policies at once
e.UpdatePolicies(
[][]string{{"alice", "data1", "write"}, {"bob", "data2", "read"}},
[][]string{{"alice", "data1", "read"}, {"bob", "data2", "write"}},
)
// Update all policies matching a filter
e.UpdateFilteredPolicies(
[][]string{{"alice", "data1", "write"}},
0,
"alice", "data1", "read",
)
How to write an update adapter
To implement the UpdateAdapter interface, your adapter needs to implement the update methods in addition to the basic Adapter interface:
// UpdatePolicy updates a policy rule from storage.
// This is part of the UpdateAdapter interface.
func (a *Adapter) UpdatePolicy(sec string, ptype string, oldRule, newRule []string) error {
// Implementation to update the policy in storage
// For example, in SQL: UPDATE casbin_rule SET v0=?, v1=?, v2=? WHERE ptype=? AND v0=? AND v1=? AND v2=?
return nil
}
// UpdatePolicies updates multiple policy rules in the storage.
// This is part of the UpdateAdapter interface.
func (a *Adapter) UpdatePolicies(sec string, ptype string, oldRules, newRules [][]string) error {
// Implementation to update multiple policies in storage
// This should be done in a transaction for consistency
return nil
}
// UpdateFilteredPolicies updates policy rules that match the filter from the storage.
// This is part of the UpdateAdapter interface.
func (a *Adapter) UpdateFilteredPolicies(sec string, ptype string, newRules [][]string, fieldIndex int, fieldValues ...string) error {
// Implementation to update filtered policies in storage
// First find policies matching the filter, then update them
return nil
}
If an adapter doesn't support the UpdateAdapter interface, Casbin will automatically fall back to using the combination of RemovePolicy() and AddPolicy() operations.
Адаптер контекста
ContextAdapter предоставляет контекстно-зависимый интерфейс для адаптеров Casbin.
Через контекст вы можете реализовать такие функции, как контроль времени ожидания для API адаптера
Example
gormadapter поддерживает адаптер с контекстом, ниже приведен контроль времени ожидания, реализованный с использованием контекста
ca, _ := NewContextAdapter("mysql", "root:@tcp(127.0.0.1:3306)/", "casbin")
// Limited time 300s
ctx, cancel := context.WithTimeout(context.Background(), 300*time.Microsecond)
defer cancel()
err := ca.AddPolicyCtx(ctx, "p", "p", []string{"alice", "data1", "read"})
if err != nil {
panic(err)
}
Как написать адаптер контекста
ContextAdapter API имеет только дополнительный слой обработки контекста, чем обычный Adapter API, и на основе реализации обычного Adapter API, вы можете инкапсулировать свою собственную логику обработки для контекста
A simple reference to the gormadapter: adapter.go
Transaction
Casbin now supports Transactions. Here's an example about how to use Transaction in gormadapter:
db, _ := gorm.Open(...)
adapter, _ := gormadapter.NewTransactionalAdapterByDB(db)
e, _ := casbin.NewTransactionalEnforcer("examples/rbac_model.conf", adapter)
ctx := context.Background()
// WithTransaction executes a function within a transaction.
// If the function returns an error, the transaction is rolled back.
// Otherwise, it's committed automatically.
err := e.WithTransaction(ctx, func(tx *casbin.Transaction) error {
tx.AddPolicy("alice", "data1", "read")
tx.AddPolicy("alice", "data1", "write")
return nil
})
// If you wish to manually handle the transaction
tx, _ := e.BeginTransaction(ctx)
tx.AddPolicy("alice", "data1", "write")
if err := tx.Commit(); err != nil {
// handle if transaction failed
}
To add this capability to your adapter, you need to implement TransactionalAdapter and TransactionContext in persist/transaction.go.
Code reference to the gormadapter: adapter.go