Casbin

Casbin

  • 文档
  • API
  • 编辑器
  • IDE 插件
  • Single Sign-On (SSO)
  • 论坛
  • 帮助
  • 博客
  • Pricing
  • Contact Sales
  • Languages icon中文
    • English
    • 한국어
    • Русский
    • Français
    • Deutsch
    • 日本語
    • 参与翻译
  • GitHub

›扩充功能

基础知识

  • 概述
  • 开始使用
  • 工作原理
  • 教程

Model

  • 支持的Models
  • Model语法
  • 效果器
  • 函数
  • 基于角色的访问控制
  • RBAC with Pattern
  • 域内RBAC
  • Casbin RBAC v.s. RBAC96
  • ABAC
  • 优先级模型
  • 超级管理员

存储

  • Model存储
  • Policy存储
  • 政策子集加载

扩充功能

  • Enforcers
  • 适配器
  • 观察者
  • 调度器
  • 角色管理器
  • 中间件
  • Graphql 中间件
  • 云端原生中间值

API

  • API 概述
  • 管理 API
  • RBAC API
  • 域内基于角色的访问控制 API
  • RoleManager API
  • 数据权限

高级用法

  • 多线程
  • 基准测试
  • 性能优化
  • Kubernetes的授权
  • 通过特使核准服务网格。

管理

  • 管理员门户
  • Casbin 服务
  • 日志 & 错误处理
  • 前端使用

编辑器

  • 在线编辑器
  • IDE 插件

更多

  • 本项目使用者
  • 贡献中
  • 隐私政策
  • 服务条款
Translate

适配器

在Casbin中,策略存储作为adapter(Casbin的中间件) 实现。 Casbin用户可以使用adapter从存储中加载策略规则 (aka LoadPolicy()) 或者将策略规则保存到其中 (aka SavePolicy())。 为了保持代码轻量级,我们没有把adapter代码放在主库中。

目前支持的适配器列表

Casbin的适配器完整列表如下。 我们欢迎任何第三方对adapter进行新的贡献,如果有请通知我们,我们将把它放在这个列表中:)

Go
Java
Node.js
PHP
Python
.NET
Rust
Ruby
Swift
Lua
适配器类型作者自动保存描述
File Adapter (内置)FileCasbin❌For .CSV (Comma-Separated Values) files
Filtered File Adapter (内置)File@faceless-saint❌对于 CSV (逗号分隔的值) 个带策略子集加载支持的文件
SQL AdapterSQL@Blank-Xu✅MySQL,PostgreSQL,SQL Server和SQLite3在 master分支中受到database/sql的支持,Oacle在 oracle分支中也受到database/sql的支持
Xorm AdapterORMCasbin✅通过 Xorm实现,支持MySQL, PostgreSQL, Sqlite3, SQL Server等多种存储引擎的adapter
Gorm AdapterORMCasbin✅通过 Gorm实现,支持MySQL, PostgreSQL, Sqlite3, SQL Server等多种存储引擎的adapter
Ent AdapterORMCasbin✅MySQL, MariaDB, PostgreSQL, SQLite, 基于Gremlin的图数据库由 [ent ORM](https://entgo. io/) 支持。
Beego ORM AdapterORMCasbin✅MySQL, PostgreSQL, Sqlite3 由 Beego ORM 支持
SQLX AdapterORM@memwey✅MySQL, PostgreSQL, SQLite, Oracle 由 SQLX 支持
Sqlx AdapterSQL@Blank-Xu✅MySQL, PostgreSQL, SQL Server, SQLite3 由 master 分支支持,Oracle由oracle 分支受到sqlx的支持
GF ORM AdapterORM@vance-liu✅MySQL, SQLite, PostgreSQL, Oracle, SQL Server 受到 GoFrame ORM 的支持
GoFrame ORM AdapterORM@kotlin2018✅MySQL, SQLite, PostgreSQL, Oracle, SQL Server由GoFrame ORM支持
Filtered PostgreSQL AdapterSQLCasbin✅针对 PostgreSQL
过滤的 pgx 适配器SQL@pckhoi✅PostgreSQL 由 pgx 支持
PostgreSQL 适配器SQL@cychiuae✅对于 PostgreSQL
RQLite 适配器SQLEDOMO 系统✅对于 RQLite
MongoDB AdapterNoSQLCasbin✅对于 MongoDB 基于 MongoDB Go 驱动程序
RethinkDB 适配器NoSQL@adityapandey9✅用于 重新thinkDB
Cassandra 适配器NoSQLCasbin❌对于 Apache Cassandra DB
动态DB 适配器NoSQLHOOQ❌用于Amazon DynamoDB
DynacasbinNoSQLNewbMiao✅对于 Amazon 动态数据库
ArangoDB 适配器NoSQL@adamwasila✅对于 ArangoDB
Amazon S3 适配器Cloud解决器❌对于 Minio and Amazon S3
Azure Cosmos DB 适配器Cloud@spacycoder✅对于 微软Azure 宇宙数据库
GCP Firesting 适配器Cloud@reedom❌对于 谷歌云平台修复
GCP 云存储适配器云qurami❌对于 谷歌云平台云存储
GCP 云端适配器云端@flowerinthenight✅对于 谷歌云平台云生成器
消费适配器KV store@ankitm123❌对于 HashiCorp Consull
Redis 适配器 (Redigo)KV storeCasbin✅用于Redis
Redis 适配器 (转发)KV store@mlsen✅用于 Redis
Etcd 适配器KV store@sebastianliu❌用于 等
BoltDB 适配器KV store@speza✅用于Bolt
螺杆适配器KV store@wireparation❌用于 箭头
徽章DB 适配器KV 商店@inits✅对于 徽章数据库
原始适配器流Casbin❌对于 谷歌协议缓存
JSON 适配器StringCasbin❌对于 JSON
字符串适配器字符串@qiangmzsx❌用于字符串
HTTP 文件适配器HTTP@h4ckedneko❌对于 http.FileSystem
文件系统适配器文件@naucon❌对于 fs.FS and embed.FS
适配器类型作者自动保存描述
File Adapter (内置)FileCasbin❌对于 CSV (逗号分隔的值) 文件
JDBC AdapterJDBCCasbin✅MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL 服务器由 JDBC 支持
Hibernate AdapterORMCasbin✅Oracle, DB2, SQL Server, Sybase, MySQL, PostgreSQL 由 Hibernate支持
MyBatis AdapterORMCasbin✅MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server (与 JDBC 相同) 由 MyBatis 3 支持
Hutool AdapterORM@mapleafgo✅MySQL, Oracle, PostgreSQL, SQLite 由 Hutool 支持
MongoDB AdapterNoSQLCasbin✅MongoDB 由 Mongodb-driver-sync 支持
DynamoDB AdapterNoSQLCasbin❌对于 Amazon DynamoDB
Redis AdapterKV storeCasbin✅用于 Redis
适配器类型作者自动保存描述
File Adapter (内置)FileCasbin❌对于 CSV (逗号分隔的值) 文件
Filtered File Adapter (内置)FileCasbin❌对于带策略子集 .CSV (逗号分隔值) 文件加载支持
String Adapter (内置)String@calebfaruki❌用于 String
Basic AdapterNative ORMCasbin✅pg, mysql, mysql2, sqlite3, oracedb, mssql 是适配器本身支持的
Sequelize AdapterORMCasbin✅MySQL、 PostgreSQL、 SQLite、 Microsoft SQL Server 由 Sequelize 支持
TypeORM AdapterORMCasbin✅MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL, MongoDB 由 TypeORM 支持
Prisma AdapterORMCasbin✅MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, AWS Aurora, Azure SQL 由 Prisma支持
Knex AdapterORM@sarneeh and knex✅MSSQL, MySQL, PostgreSQL, SQLite3, Oracle 由 Knex.js支持
Objection.js AdapterORM@willsoto✅MSSQL, MySQL, PostgreSQL, SQLite3, Oracle 由 Objection.js 支持
Node PostgreSQL Native AdapterSQL@touchifyapp✅PostgreSQL 适配器,拥有高级策略子集加载支持以及由 [node-postgres](https://node-postgres. com/) 构建的更好的性能。
MongoDB AdapterNoSQLelastic.io 和 Casbin✅MongoDB 由 Mongoose 支持
Mongoose 适配器 (无交易)NoSQLminhducck✅MongoDB 由 Mongoose 支持
Node MongoDB 原生 AdapterNoSQL@juicycleff✅用于 Node MongoDB Native
DynamoDB AdapterNoSQL@fospitia✅用于Amazon DynamoDB
Couchbase AdapterNoSQL@MarkMYoung✅用于 Couchbase
Redis AdapterKV storeCasbin❌用于 Redis
Redis AdapterKV store@NandaKishorJeripothula❌用于 Redis
适配器类型作者自动保存描述
文件适配器 (内置)FileCasbin❌用于 .CSV (Comma-Separated Values) 文件
数据库适配器ORMCasbin✅MySQL, PostgreSQL, SQLite, Microsoft SQL Server 由 techone/database 支持
Zend Db 适配器ORMCasbin✅MySQL, PostgreSQL, SQLite, Oracle, IBM DB2, Microsoft SQL Server, 其他 PDO Driver 由 zend-db 支持
Doctrine DBAL 适配器(建议)ORMCasbin✅强大的 PHP 数据库抽象层(DBAL),具有数据库架构内省和管理的许多功能。
Medoo 适配器ORMCasbin✅Medoo 是一个用来加速开发的轻量PHP 数据库框架。 支持所有 SQL 数据库,包括 MySQL, MSSQL, SQLite, MariaDB, PostgreSQL, Sybase, Oracle 以及更多。
Laminas-db 适配器ORMCasbin✅MySQL, PostgreSQL, Oracle, IBM DB2, Microsoft Sql Server, PDO等。 由 laminas-db 支持
Zend-db 适配器ORMCasbin✅MySQL, PostgreSQL, Oracle, IBM DB2, Microsoft Sql Server, PDO等。 由 zend-db 支持
Redis 适配器KV store@nsnake❌用于 Redis
适配器类型作者自动保存描述
文件适配器(内置)FileCasbin❌对于 CSV 文件
SQLAlchemy 适配器ORMCasbin✅PostgreSQL、MySQLite、Oracle、Microsoft SQL Server、Firebird、Sybase 由 SQLAlchemy 支持
异步数据库适配器ORMsampingantech✅PostgreSQL、MySQLite、Oracle、Microsoft SQL Server、Firebird、Sybase 由 Databases 支持。
Peewee 适配器ORM@shblhy✅PostgreSQL、 MySQL、 SQLite 由 Peewee 支持
MongoEngine 适配器ORM@zhangbailong945❌MongoDB 由 MongoEngine 支持
Pony ORM AdapterORM@drorvinkler✅MySQL, PostgreSQL, SQLite, Oracle, CockroachDB由Pony ORM支持
Tortoise ORM AdapterORM@thearchitector✅PostgreSQL (>=9.4), MySQL, MariaDB, 和 SQLite 都由 Tortoise ORM 支持
Couchbase AdapterNoSQLScienceLogic✅ (没有 remove_filtered_policy())用于 Couchbase
DynamoDB AdapterNoSQL@abqadeer✅用于 DynamoDB
Pymongo AdapterNoSQLCasbin❌MongoDB 由 [Pymongo 支持](https://pypi. org/project/pymongo/)
GCP 防火基适配器云端@devrushi41✅对于 谷歌云平台火基
Async ormar AdapterORMsampingantech✅支持PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase。由 ormar维护
适配器类型作者自动保存机制说明
文件适配器 (内置)FileCasbin❌用于 .CSV 文件
EF 适配器ORMCasbin❌MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, 等等 由 [Entity Framework 6](https://docs. microsoft. com/en-us/ef/ef6/) 支持
EFCore 适配器ORMCasbin✅MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, 等等. 由 Entity Framework Core 支持
EFCore 适配器 (.NET Core 5)ORM@g4dvali✅MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, 等等 由 Entity Framework Core 支持
适配器类型作者自动保存机制说明
文件适配器 (内置)FileCasbin❌用于 .CSV 文件
Diesel 适配器ORMCasbin✅SQLite, PostgreSQL, MySQL 由 Diesel 支持
Sqlx 适配器ORMCasbin✅PostgreSQL, MySQL 由 Sqlx 支持,可实现完全异步操作
SeaORM 适配器ORMlingdu1234✅PostgreSQL, MySQL 由 SeaORM 完全异步操作支持
JSON 适配器字符串Casbin✅对于 JSON
YAML 适配器字符串Casbin✅对于 YAML
Adapter类型作者自动保存描述
File Adapter (内置)文件Casbin❌用于 .CSV (Comma-Separated Values) 文件
Sequelize AdapterORMCasbinRuby✅ADO, Amalgalite, IBM_DB, JDBC, MySQL, Mysql2, ODBC, Oracle, PostgreSQL, SQLAnywhere SQLite3, 和 TinyTDS 都由 Sequel 支持
Adapter类型作者自动保存描述
File Adapter (内置)FileCasbin❌用于 .CSV (Comma-Separated Values) 文件
Memory Adapter (内置)内存Casbin❌用于内存
Fluent AdapterORMCasbin✅PostgreSQL、SQLite、MySQL、MongoDB 由 Fluent 支持
适配器类型作者AutoSave描述
文件适配器(内置)文件Casbin❌对于 CSV (逗号分隔的值) 文件
过滤文件适配器(内置)文件Casbin❌对于 CSV (逗号分隔的值) 个带策略子集加载支持的文件
LuaSQL 适配器ORMCasbin✅MySQL, PostgreSQL, SQLite3 由 LuaSQL 支持
4daysORM 适配器ORMCasbin✅MySQL, SQLite3 由 4DaysORM 支持
note
  1. 如果使用显式或隐式adapter调用casbin.NewEnforcer(),策略将自动加载。
  2. 可以调用e.LoadPolicy() 来从存储中重新加载策略规则。
  3. 如果adapter不支持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 数据库初始化执行器。 它在 127.0.0.1:3306 上连接到 MySQL DB 与 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
// 请确保您激活了 `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

您可以使用自己的适配器,如下所示:

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()
  1. 将你的适配器从 A 转换为 B

    e.SetAdapter(B)
    
  2. 将策略从内存保存到 B

    e.loadPolicy()
    

在运行时保存

你也可能想要重新加载模型。 初始化后重新加载策略或保存策略:

// 重新载入模型CONF文件中的模型。.
e.LoadModel()

// 从文件/数据库重新加载策略。
e.LoadPolicy()

// 保存当前策略 (通常使用 Casbin API更改后) 返回文件/数据库。
e.SavePolicy()

## 自动保存

适配器有一个叫做 `自动保存` 的功能。 当适配器支持 `自动保存`, 它意味着它可以支持在储存中添加单一的政策规则,或者从储存中删除单一的政策规则。 这不同于 `SavePolicy()`, 因为后者将删除存储中的所有政策规则,并将所有政策规则从卡斯宾执行器保存到存储器。 因此,当政策规则数目庞大时,它可能会遇到业绩问题。

当适配器支持 `自动保存`,您可以通过 `Enforcer.EnableAutoSave()` 函数切换此选项。 默认启用此选项(如果适配器支持它)。

:::note

1. `自动保存` 功能是可选的。 适配器可以选择实现它。
2. `自动保存` 仅适用于适配器使用时的 Casbin 执行者。
3. 请参阅上面适配器列表中的 `自动保存` 列,以查看 `自动保存` 是否得到适配器的支持。
:::

下面是如何使用 `自动保存` 的示例:

```go
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(...)

欲了解更多例子,请参阅:https://github.com/casbin/xorm-adapter/blob/master/adapter_test.go

如何编写 Adapter

所有适配器都应该通过提供至少两个强制方法实现 适配器 接口:LoadPolicy(model model.Model) error 和 SavePolicy(model model.Model) error.

其他三项职能是任择性的。 如果适配器支持 自动保存 功能,则应实现这些功能。

方法类型描述
LoadPolicy()强制的从存储中加载所有策略规则
SavePolicy()强制的将所有策略规则保存到存储中
AddPolicy()可选择的向存储中添加策略规则
RemovePolicy()可选择的从存储中删除策略规则
RemoveFilteredPolicy()可选择的从存储中删除匹配筛选器的策略规则
note

如果适配器不支持 自动保存, 它应该为三个可选函数提供一个空的实现。 下面是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")
}

Cassbin enforcer 会在调用这三个可选函数时忽略 个未执行 错误。

关于如何写入适配器的详细信息。

  • 数据结构 适配器应 最少 支持六列。
  • 数据库名称: 默认数据库名称应该是 casbin。
  • 表格名称 默认表名应该是 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" ] ] }

谁负责创建数据库?

作为一项公约, 适配器应该能够自动创建一个名为 casbin 的数据库,如果它不存在并且用于策略存储。 请使用 Xorm 适配器作为参考实现: https://github.com/casbin/xorm-adapter

← Enforcers观察者 →
  • 目前支持的适配器列表
  • 例子
    • 文件适配器 (内置)
    • MySQL 适配器
  • 使用自建的adapter
  • 在不同适配器之间迁移/转换
  • 在运行时保存
    • 如何编写 Adapter
    • 谁负责创建数据库?
Casbin
Docs
Getting StartedManagement APIRBAC APIMiddlewares
Community
Who's using Casbin?Stack Overflow
Casbin          jCasbin
Node-Casbin   PHP-CasbinPyCasbin          Casbin.NETCasbin-CPP        Casbin-RS
Follow @casbinHQ
Copyright © 2022 Casbin Organization