适配器
在Casbin中,策略存储作为adapter(Casbin的中间件) 实现。 Casbin用户可以使用adapter从存储中加载策略规则 (aka LoadPolicy()
) 或者将策略规则保存到其中 (aka SavePolicy()
)。 为了保持代码轻量级,我们没有把adapter代码放在主库中。
目前支持的适配器列表
Casbin的适配器完整列表如下。 我们欢迎任何第三方对adapter进行新的贡献,如果有请通知我们,我们将把它放在这个列表中:)
GoJavaNode.jsPHPPython.NETRustRubySwiftLua适配器 | 类型 | 作者 | 自动保存 | 描述 |
---|---|---|---|---|
File Adapter (内置) | File | Casbin | no | 对于 CSV (逗号分隔的值) 文件 |
JDBC Adapter | JDBC | Casbin | yes | MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL 服务器由 JDBC 支持 |
Hibernate Adapter | ORM | Casbin | yes | Oracle, DB2, SQL Server, Sybase, MySQL, PostgreSQL 由 Hibernate支持 |
MyBatis Adapter | ORM | Casbin | yes | MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server (与 JDBC 相同) 由 MyBatis 3 支持 |
Hutool Adapter | ORM | @mapleafgo | yes | MySQL, Oracle, PostgreSQL, SQLite 由 Hutool 支持 |
MongoDB Adapter | NoSQL | Casbin | yes | MongoDB 由 Mongodb-driver-sync 支持 |
DynamoDB Adapter | NoSQL | Casbin | no | 对于 Amazon DynamoDB |
Redis Adapter | KV store | Casbin | yes | 用于 Redis |
适配器 | 类型 | 作者 | 自动保存 | 描述 |
---|---|---|---|---|
File Adapter (内置) | File | Casbin | no | 对于 CSV (逗号分隔的值) 文件 |
Filtered File Adapter (内置) | File | Casbin | no | 对于带策略子集 .CSV (逗号分隔值) 文件加载支持 |
String Adapter (内置) | String | @calebfaruki | no | 用于 String |
Basic Adapter | Native ORM | Casbin | yes | pg, mysql, mysql2, sqlite3, oracedb, mssql 是适配器本身支持的 |
Sequelize Adapter | ORM | Casbin | yes | MySQL、 PostgreSQL、 SQLite、 Microsoft SQL Server 由 Sequelize 支持 |
TypeORM Adapter | ORM | Casbin | yes | MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL, MongoDB 由 TypeORM 支持 |
Prisma Adapter | ORM | Casbin | yes | MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, AWS Aurora, Azure SQL 由 Prisma支持 |
Knex Adapter | ORM | @sarneeh and knex | yes | MSSQL, MySQL, PostgreSQL, SQLite3, Oracle 由 Knex.js支持 |
Objection.js Adapter | ORM | @willsoto | yes | MSSQL, MySQL, PostgreSQL, SQLite3, Oracle 由 Objection.js 支持 |
Node PostgreSQL Native Adapter | SQL | @touchifyapp | yes | PostgreSQL 适配器,拥有高级策略子集加载支持以及由 [node-postgres](https://node-postgres. com/) 构建的更好的性能。 |
MongoDB Adapter | NoSQL | elastic.io 和 Casbin | yes | MongoDB 由 Mongoose 支持 |
Mongoose 适配器 (无交易) | NoSQL | minhducck | yes | MongoDB 由 Mongoose 支持 |
Node MongoDB 原生 Adapter | NoSQL | @juicycleff | yes | 用于 Node MongoDB Native |
DynamoDB Adapter | NoSQL | @fospitia | yes | 用于Amazon DynamoDB |
Couchbase Adapter | NoSQL | @MarkMYoung | yes | 用于 Couchbase |
Redis Adapter | KV store | Casbin | no | 用于 Redis |
Redis Adapter | KV store | @NandaKishorJeripothula | no | 用于 Redis |
适配器 | 类型 | 作者 | 自动保存 | 描述 |
---|---|---|---|---|
文件适配器 (内置) | File | Casbin | no | 用于 .CSV (Comma-Separated Values) 文件 |
数据库适配器 | ORM | Casbin | yes | MySQL, PostgreSQL, SQLite, Microsoft SQL Server 由 techone/database 支持 |
Zend Db 适配器 | ORM | Casbin | yes | MySQL, PostgreSQL, SQLite, Oracle, IBM DB2, Microsoft SQL Server, 其他 PDO Driver 由 zend-db 支持 |
Doctrine DBAL 适配器(建议) | ORM | Casbin | yes | 强大的 PHP 数据库抽象层(DBAL),具有数据库架构内省和管理的许多功能。 |
Medoo 适配器 | ORM | Casbin | yes | Medoo 是一个用来加速开发的轻量PHP 数据库框架。 支持所有 SQL 数据库,包括 MySQL , MSSQL , SQLite , MariaDB , PostgreSQL , Sybase , Oracle 以及更多。 |
Laminas-db 适配器 | ORM | Casbin | yes | MySQL, PostgreSQL, Oracle, IBM DB2, Microsoft Sql Server, PDO等。 由 laminas-db 支持 |
Zend-db 适配器 | ORM | Casbin | yes | MySQL, PostgreSQL, Oracle, IBM DB2, Microsoft Sql Server, PDO等。 由 zend-db 支持 |
Redis 适配器 | KV store | @nsnake | no | 用于 Redis |
适配器 | 类型 | 作者 | 自动保存 | 描述 |
---|---|---|---|---|
文件适配器(内置) | File | Casbin | no | 对于 CSV 文件 |
SQLAlchemy 适配器 | ORM | Casbin | yes | PostgreSQL、MySQLite、Oracle、Microsoft SQL Server、Firebird、Sybase 由 SQLAlchemy 支持 |
异步数据库适配器 | ORM | sampingantech | yes | PostgreSQL、MySQLite、Oracle、Microsoft SQL Server、Firebird、Sybase 由 Databases 支持。 |
Peewee 适配器 | ORM | @shblhy | yes | PostgreSQL、 MySQL、 SQLite 由 Peewee 支持 |
MongoEngine 适配器 | ORM | @zhangbailong945 | no | MongoDB 由 MongoEngine 支持 |
Pony ORM Adapter | ORM | @drorvinkler | yes | MySQL, PostgreSQL, SQLite, Oracle, CockroachDB由Pony ORM支持 |
Tortoise ORM Adapter | ORM | @thearchitector | yes | PostgreSQL (>=9.4), MySQL, MariaDB, 和 SQLite 都由 Tortoise ORM 支持 |
Couchbase Adapter | NoSQL | ScienceLogic | yes (没有 remove_filtered_policy() ) | 用于 Couchbase |
DynamoDB Adapter | NoSQL | @abqadeer | yes | 用于 DynamoDB |
Pymongo 适配器 | NoSQL | Casbin | no | MongoDB 由 [Pymongo 支持](https://pypi. org/project/pymongo/) |
适配器 | 类型 | 作者 | 自动保存机制 | 说明 |
---|---|---|---|---|
文件适配器 (内置) | File | Casbin | no | 用于 .CSV 文件 |
EF 适配器 | ORM | Casbin | no | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, 等等 由 [Entity Framework 6](https://docs. microsoft. com/en-us/ef/ef6/) 支持 |
EFCore 适配器 | ORM | Casbin | yes | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, 等等. 由 Entity Framework Core 支持 |
EFCore 适配器 (.NET Core 5) | ORM | @g4dvali | yes | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, 等等 由 Entity Framework Core 支持 |
适配器 | 类型 | 作者 | 自动保存机制 | 说明 |
---|---|---|---|---|
文件适配器 (内置) | File | Casbin | no | 用于 .CSV 文件 |
Diesel 适配器 | ORM | Casbin | yes | SQLite, PostgreSQL, MySQL 由 Diesel 支持 |
Sqlx 适配器 | ORM | Casbin | yes | PostgreSQL, MySQL 由 Sqlx 支持,可实现完全异步操作 |
JSON Adapter | String | Casbin | yes | 用于JSON |
YAML Adapter | 字符串 | Casbin | yes | 用于 YAML |
Adapter | 类型 | 作者 | 自动保存 | 描述 |
---|---|---|---|---|
File Adapter (内置) | 文件 | Casbin | no | 用于 .CSV (Comma-Separated Values) 文件 |
Sequelize Adapter | ORM | CasbinRuby | yes | ADO, Amalgalite, IBM_DB, JDBC, MySQL, Mysql2, ODBC, Oracle, PostgreSQL, SQLAnywhere SQLite3, 和 TinyTDS 都由 Sequel 支持 |
Adapter | 类型 | 作者 | 自动保存 | 描述 |
---|---|---|---|---|
File Adapter (内置) | File | Casbin | no | 用于 .CSV (Comma-Separated Values) 文件 |
Memory Adapter (内置) | 内存 | Casbin | no | 用于内存 |
Fluent Adapter | ORM | Casbin | yes | PostgreSQL、SQLite、MySQL、MongoDB 由 Fluent 支持 |
Adapter | Type | Author | AutoSave | Description |
---|---|---|---|---|
File Adapter (built-in) | File | Casbin | no | For .CSV (Comma-Separated Values) files |
Filtered File Adapter (built-in) | File | Casbin | no | For .CSV (Comma-Separated Values) files with policy subset loading support |
LuaSQL Adapter | ORM | Casbin | yes | MySQL, PostgreSQL, SQLite3 are supported by LuaSQL |
4DaysORM Adapter | ORM | Casbin | yes | MySQL, SQLite3 are supported by 4DaysORM |
note
- 如果使用显式或隐式adapter调用
casbin.NewEnforcer()
,策略将自动加载。 - 可以调用
e.LoadPolicy()
来从存储中重新加载策略规则。 - 如果adapter不支持
Auto-Save
特性,则在添加或删除策略时不能将策略规则自动保存回存储器。 你必须手动调用SavePolicy()
来保存所有的策略规则
例子
Here we provide several examples:
文件适配器 (内置)
Below shows how to initialize an enforcer from the built-in file adapter:
GoPHPRustimport "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?;
This is the same with:
GoPHPRustimport (
"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 适配器
Below shows how to initialize an enforcer from MySQL database. it connects to a MySQL DB on 127.0.0.1:3306 with root and blank password.
GoRustPHPimport (
"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
// 请确保您激活了 `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);
使用自建的adapter
You can use your own adapter like below:
import (
"github.com/casbin/casbin"
"github.com/your-username/your-repo"
)
a := yourpackage.NewAdapter(params)
e := casbin.NewEnforcer("examples/basic_model.conf", a)
Migrate/Convert between different adapter
If you want to convert adapter from A
to B
, you can do like this:
- Load policy from A to memory
e, _ := NewEnforcer(m, A)
or
e.SetAdapter(A)
e.LoadPolicy()
convert your adapter from A to 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()
// Reload the policy from file/database.
e.LoadPolicy()
// Save the current policy (usually after changed with Casbin API) back to file/database.
e.SavePolicy()
自动保存
There is a feature called Auto-Save
for adapters. When an adapter supports Auto-Save
, it means it can support adding a single policy rule to the storage, or removing a single policy rule from the storage. This is unlike SavePolicy()
, because the latter will delete all policy rules in the storage and save all policy rules from Casbin enforcer to the storage. So it may suffer performance issue when the number of policy rules is large.
When the adapter supports Auto-Save
, you can switch this option via Enforcer.EnableAutoSave()
function. The option is enabled by default (if the adapter supports it).
note
- The
Auto-Save
feature is optional. An adapter can choose to implement it or not. Auto-Save
only works for a Casbin enforcer when the adapter the enforcer uses supports it.- See the
AutoSave
column in the above adapter list to see ifAuto-Save
is supported by an adapter.
Here's an example about how to use Auto-Save
:
import (
"github.com/casbin/casbin"
"github.com/casbin/xorm-adapter"
_ "github.com/go-sql-driver/mysql"
)
// enforcer会默认开启AutoSave机制.
a := xormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/")
e := casbin.NewEnforcer("examples/basic_model.conf", a)
// 禁用AutoSave机制
e.EnableAutoSave(false)
// 因为禁用了AutoSave,当前策略的改变只在内存中生效
// 这些策略在持久层中仍是不变的
e.AddPolicy(...)
e.RemovePolicy(...)
// 开启AutoSave机制
e.EnableAutoSave(true)
// 因为开启了AutoSave机制,现在内存中的改变会同步回写到持久层中
e.AddPolicy(...)
e.RemovePolicy(...)
For more examples, please see: https://github.com/casbin/xorm-adapter/blob/master/adapter_test.go
如何编写 Adapter
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
.
The other three functions are optional. They should be implemented if the adapter supports the Auto-Save
feature.
方法 | 类型 | 描述 |
---|---|---|
LoadPolicy() | 强制的 | 从存储中加载所有策略规则 |
SavePolicy() | 强制的 | 将所有策略规则保存到存储中 |
AddPolicy() | 可选择的 | 向存储中添加策略规则 |
RemovePolicy() | 可选择的 | 从存储中删除策略规则 |
RemoveFilteredPolicy() | 可选择的 | 从存储中删除匹配筛选器的策略规则 |
note
If an adapter doesn't support Auto-Save
, it should provide an empty implementation for the three optional functions. Here's an example for Golang:
/ AddPolicy 向存储器添加了一条策略规则。
func (a *Adapter) AddPolicy(sec string, ptype string, rule []string) error {
return errors.New("not implemented")
}
// RemovePolicy 从存储器中移除一条策略规则。
func (a *Adapter) RemovePolicy(sec string, ptype string, rule []string) error {
return errors.New("not implemented")
}
// RemoveFilteredPolicy 从存储器中移除可匹配过滤器的策略规则。
func (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) error {
return errors.New("not implemented")
}
Casbin enforcer will ignore the not implemented
error when calling these three optional functions.
There're details about how to write an adapter.
- 数据结构 适配器应 最少 支持六列。
- 数据库名称: 默认数据库名称应该是
cassbin
。 - 表格名称 默认表名应该是
casbin_rule
。 - Ptype 栏。 此列的名称应该是
ptype
而不是p_type
或Ptype
。 - 表定义应该是
(id int priorkey, ptype varchar, v0 varchar, v1 varchar, v2 varchar, v3 varchar, v4 varchar, v5 varchar)
- 唯一的密钥索引应该建立在列
ptype, v0, v1, v2, v3, v4, v5
上。 LoadFilteredPolicy
需要filter
作为参数。 Filter应该像这样。 json { "p":[ [ "alice" ], [ "bob" ] ], "g":[ [ "", "book_group" ], [ "", "pen_group" ] ], "g2":[ [ "alice" ] ] }
谁负责创建数据库?
As a convention, the adapter should be able to automatically create a database named casbin
if it doesn't exist and use it for policy storage. Please use the Xorm adapter as a reference implementation: https://github.com/casbin/xorm-adapter