Адаптеры
В Касбине хранилища политики реализованы как адаптер (aka middleware for Casbin). Пользователь Casbin может использовать адаптер для загрузки правил политики хранения (aka LoadPolicy()
), или сохранить правила политики к ней (aka SavePolicy()
). Чтобы сохранить легкий вес, мы не ставим код адаптера в основную библиотеку.
Поддерживаемые адаптеры
Полный список адаптеров Casbin приводится ниже. Любой вклад сторонних разработчиков на новом адаптере приветствуется, пожалуйста, сообщите нам, и мы поместим его в этот список:)
- Go
- Java
- Node.js
- PHP
- Python
- .NET
- Rust
- Ruby
- Swift
- Lua
Адаптер | Тип | Автор | AutoSave | Описание |
---|---|---|---|---|
Файл адаптер (встроенный) | Файл | Casbin | ❌ | Для .CSV (запятые значения) файлов |
Адаптер JDBC | JDBC | Casbin | ✅ | MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server поддерживаются JDBC |
Спящий адаптер | ORM | Casbin | ✅ | Oracle, DB2, SQL Server, Sybase, MySQL, PostgreSQL поддерживаются Hibernate |
Мибатис Адаптер | ORM | Casbin | ✅ | MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server (то же что и JDBC) поддерживаются MyBatis 3 |
Адаптер Хутола | ORM | @mapleafgo | ✅ | MySQL, Oracle, PostgreSQL, SQLite поддерживается Hutool |
MongoDB Adapter | NoSQL | Casbin | ✅ | MongoDB поддерживается mongodb-driver-sync |
Динамический адаптер | NoSQL | Casbin | ❌ | Для Amazon DynamoDB |
Адаптер Redis | Магазин KV | Casbin | ✅ | Для Redis |
Адаптер | Тип | Автор | AutoSave | Описание |
---|---|---|---|---|
Файл адаптер (встроенный) | Файл | Casbin | ❌ | Для .CSV (запятые значения) файлов |
Фильтрованный файловый адаптер (встроенный) | File | Casbin | ❌ | Для .CSV (Значения, разделенные запятыми) файлов с поддержкой загрузки подмножеств политики |
Адаптер строки (встроенный) | Строка | @calebfaruki | ❌ | Для строки |
Базовый адаптер | Родной ORM | Casbin | ✅ | pg, mysql, mysql2, sqlite3, oracledb, mssql поддерживает сам адаптер |
Последовательный адаптер | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server поддерживаются Последовательность |
Адаптер TypeORM | ORM | Casbin | ✅ | MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL, MongoDB поддерживаются TypeORM |
Адаптер Призма | ORM | Casbin | ✅ | MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, AWS Aurora, Azure SQL поддерживаются Prisma |
Адаптер K | ORM | knex | ✅ | MSSQL, MySQL, PostgreSQL, SQLite3, Oracle поддерживаются Knex.js |
Адаптер Objection.js | ORM | @willsoto | ✅ | MSSQL, MySQL, PostgreSQL, SQLite3, Oracle поддерживаются Objection.js |
MikroORM Adapter | ORM | @baisheng | ✅ | MongoDB, MySQL, MariaDB, PostgreSQL, SQLite are supported by MikroORM |
Родной адаптер узла PostgreSQL | SQL | @touchifyapp | ✅ | PostgreSQL адаптер с поддержкой расширенной загрузки подмножества политик и улучшенной производительности, построенной на node-postgres. |
Адаптер Монгозы | NoSQL | elastic.io и Касбин | ✅ | MongoDB поддерживается Mongoose |
Адаптер Монгозы (Без транзакции) | NoSQL | minhducck | ✅ | MongoDB is supported by Mongoose |
Узел MongoDB Родной адаптер | NoSQL | @juicycleff | ✅ | Для родина узла MongoDB |
Динамический адаптер | NoSQL | @fospitia | ✅ | Для Amazon DynamoDB |
Адаптер базы купонов | NoSQL | @MarkMYoung | ✅ | Для Купона |
Адаптер Redis | Магазин KV | Casbin | ❌ | Для Redis |
Redis Adapter | KV store | @NandaKishorJeripothula | ❌ | For Redis |
Адаптер | Тип | Автор | AutoSave | Описание |
---|---|---|---|---|
Файл адаптер (встроенный) | Файл | Casbin | ❌ | Для .CSV (запятые значения) файлов |
Адаптер базы данных | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server поддерживаются techone/database |
Адаптер Zend Db | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Oracle, IBM DB2, Microsoft SQL Server, Other PDO Driver поддерживаются zend-db |
Доктрин DBAL адаптер (рекомендуется) | ORM | Casbin | ✅ | Мощный абстрактный уровень PHP (DBAL) с множеством функций для управления схемой баз данных. |
Adapter Medoo | ORM | Casbin | ✅ | Medoo - это легкий фреймворк базы данных PHP для ускорения разработки, поддерживает все базы данных SQL, включая MySQL , MSSQL , SQLite , MariaDB , PostgreSQL , Sybase , Oracle и больше. |
Адаптер Laminas-db | ORM | Casbin | ✅ | MySQL, PostgreSQL, Oracle, IBM DB2, Microsoft SQL Server, PDO, etc. are supported by laminas-db |
Адаптер Zend-db | 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 | Магазин KV | @nsnake | ❌ | Для Redis |
Адаптер | Тип | Автор | AutoSave | Описание |
---|---|---|---|---|
Файл адаптер (встроенный) | Файл | Casbin | ❌ | Для .CSV (запятые значения) файлов |
Адаптер Django ORM | ORM | Casbin | ✅ | PostgreSQL, MariaDB, MySQL, Oracle, SQLite, IBM DB2, Microsoft SQL Server, Firebird, ODBC поддерживаются Django ORM |
Адаптер SQLObject | ORM | Casbin | ✅ | PostgreSQL, MySQL, SQLite, Microsoft SQL Server, Firebird, Sybase, MAX DB, pyfirebirdsql поддерживаются SQLObject |
Адаптер SQLAlchemy | ORM | Casbin | ✅ | PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase поддерживаются SQLAlchemy |
Async SQLAlchemy Adapter | ORM | Casbin | ✅ | PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase are supported by SQLAlchemy |
Асинхронный адаптер баз данных | ORM | Casbin | ✅ | PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase поддерживаются базами данных |
Peewee адаптер | ORM | @shblhy | ✅ | PostgreSQL, MySQL, SQLite поддерживается Peewee |
Адаптер MongoEngine | ORM | @zhangbailong945 | ❌ | MongoDB поддерживается MongoEngine |
Адаптер Pony ORM | ORM | @drorvinkler | ✅ | MySQL, PostgreSQL, SQLite, Oracle, CockroachDB поддерживаются Pony ORM |
Адаптер ORM | ORM | @thearchitector | ✅ | PostgreSQL (>=9.4), MySQL, MariaDB и SQLite поддерживаются 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 |
Адаптер базы купонов | NoSQL | Логика | ✅ (без remove_filtered_policy() ) | Для Купона |
Динамический адаптер | NoSQL | @abqadeer | ✅ | Для DynamoDB |
Адаптер Пимонго | NoSQL | Casbin | ❌ | MongoDB поддерживается Pymongo |
Redis Adapter | KV store | Casbin | ✅ | For Redis |
GCP адаптер огненной базы | Облако | @devrushi41 | ✅ | Для Google Cloud Platform Firebase |
Адаптер | Тип | Автор | AutoSave | Описание |
---|---|---|---|---|
Файл адаптер (встроенный) | Файл | Casbin | ❌ | Для .CSV (запятые значения) файлов |
Адаптер EF | ORM | Casbin | ❌ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2 и т. д. поддерживаются Entity Framework 6 |
EFCore адаптер | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2 и т. д. поддерживаются 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 |
Адаптер | Тип | Автор | AutoSave | Описание |
---|---|---|---|---|
Файл адаптер (встроенный) | Файл | Casbin | ❌ | Для .CSV (запятые значения) файлов |
Адаптер дизеля | ORM | Casbin | ✅ | SQLite, PostgreSQL, MySQL поддерживается дизелем |
Адаптер Sqlx | ORM | Casbin | ✅ | PostgreSQL, MySQL поддерживается Sqlx с полностью асинхронной операцией |
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 адаптер | Строка | Casbin | ✅ | Для JSON |
Адаптер YAML | String | Casbin | ✅ | Для YAML |
Адаптер | Тип | Автор | AutoSave | Описание |
---|---|---|---|---|
Файл адаптер (встроенный) | Файл | Casbin | ❌ | Для .CSV (запятые значения) файлов |
Адаптер последовательности | ORM | CasbinRuby | ✅ | ADO, Amalgalite, IBM_DB, JDBC, MySQL, Mysql2, ODBC, Oracle, PostgreSQL, SQLAnywhere, SQLite3 и TinyTDS поддерживаются Sequel |
Адаптер | Тип | Автор | AutoSave | Описание |
---|---|---|---|---|
Файл адаптер (встроенный) | Файл | Casbin | ❌ | Для .CSV (запятые значения) файлов |
Адаптер памяти (встроенный) | Память | Casbin | ❌ | За память |
Флюантовый адаптер | ORM | Casbin | ✅ | PostgreSQL, SQLite, MySQL, MongoDB поддерживаются Fluent |
Адаптер | Тип | Автор | AutoSave | Описание |
---|---|---|---|---|
Файл адаптер (встроенный) | Файл | Casbin | ❌ | Для .CSV (запятые значения) файлов |
Фильтрованный файловый адаптер (встроенный) | File | Casbin | ❌ | Для .CSV (Значения, разделенные запятыми) файлов с поддержкой загрузки подмножеств политики |
Adapter LuaSQL | ORM | Casbin | ✅ | MySQL, PostgreSQL, SQLite3 are supported by LuaSQL |
4Дни адаптер | ORM | Casbin | ✅ | MySQL, SQLite3 поддерживается 4DaysORM |
OpenResty Adapter | ORM | @tom2nonames | ✅ | MySQL, PostgreSQL are supported by it |
- Если
casbin.NewEnforcer()
вызывается с явным или неявным адаптером, политика будет загружена автоматически. - Вы можете вызвать
e.LoadPolicy()
для перезагрузки правил политики из хранилища. - Если адаптер не поддерживает функцию
Автосохранения
, Правила политики не могут быть автоматически сохранены в хранилище, когда вы добавляете или удаляете политики. Вы должны вызвать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 adapter
Ниже показано, как инициализировать применение из базы данных 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. om/casbin-rs/diesel-adapter
// убедитесь, что вы активировали функцию `mysql`
используйте казино::prelude::*;
use diesel_adapter::{ConnOptions, DieselAdapter};
let mut conn_opts = ConnOptions::default();
conn_opts
. et_hostname("127.0.0.1")
. et_port(3306)
.set_host("127.0.0.1:3306") // перезаписываем имя хоста, конфигурацию порта
.set_database("casbin")
. et_auth("casbin_rs", "casbin_rs");
let a = DieselAdapter::new(conn_opts)?;
let mut e = Enforcer::new("examples/basic_model.conf", a).await?;
// https://github. om/php-casbin/dbal-adapter
use Casbin\Enforcer;
use CasbinAdapter\DBAL\Adapter as DatabaseAdapter;
$config = [
// Либо 'driver' с одним из следующих значений:
// pdo_mysql, do_sqlite,pdo_pgsql,pdo_oci (нестабильный),pdo_sqlsrv,pdo_sqlsrv,
// mysqli,sqlanywhere,sqlsrv,ibm_db2 (нестабильный), rizzle_pdo_mysql
'водитель' => 'pdo_mysql',
'host' => '127. .0.1',
'dbname' => 'test',
'user' => 'root',
'password' => '',
'port' => '3306',
];
$a = DatabaseAdapter::newAdapter($config);
$e = new Enforcer('examples/basic_model. в', $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
, вы можете сделать так:
Загрузить политику из A в память
e, _ := NewEnforcer(m, A)
или
e.SetAdapter(A)
e.LoadPolicy()преобразовать ваш адаптер из A в B
e.SetAdapter(B)
Сохранить политику из памяти в B
e.SavePolicy()
Загрузка/сохранение при запуске
Вы также можете захотеть перезагрузить модель, перезагрузить политику или сохранить ее после инициализации:
// Перезагрузите модель из файла CONF.
e.LoadModel()
// Перезагрузка политики из файла/базы данных.
e.LoadPolicy()
// Сохраняем текущую политику (обычно после изменения с API Касбина) обратно в файл/базу данных.
e.SavePolicy()
AutoSave
Есть возможность Автосохранение
для адаптеров. Когда адаптер поддерживает Автосохранение
, это означает, что он может поддерживать добавление единого правила политики для хранения или удаление одного правила политики из хранилища. Это в отличие от SavePolicy()
, потому что последний удалит все правила политики хранения и сохранит все правила политики из Касбина в хранилище. Таким образом, он может пострадать от проблем с эффективностью, когда количество правил политики является большим.
Когда адаптер поддерживает Автосохранение
, вы можете переключить эту опцию через функцию Enforcer.EnableAutoSave()
. По умолчанию эта опция включена (если адаптер поддерживает ее).
- Функция
Автосохранение
является необязательной. Адаптер может выбрать для реализации его или нет. Автосохранение
работает только для правоохранителя Касбина, когда адаптер использует его.- Смотрите столбец
Автосохранение
в приведенном выше списке адаптеров, чтобы увидеть, поддерживается лиАвтосохранение
адаптером.
Вот пример использования Автосохранения
:
import (
"github.com/casbin/casbin"
"github.com/casbin/xorm-adapter"
_ "github.com/go-sql-driver/mysql"
)
// По умолчанию включена опция автосохранения для enforcer.
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)
// Потому что автосохранение отключено, изменение политики только влияет на политику в Casbin enforcer,
// это не влияет на политику хранения.
e.AddPolicy(...)
e.RemovePolicy(...)
// Включите опцию автосохранения.
e.EnableAutoSave(true)
// Потому что включено автосохранение, изменения политики не только влияют на политику в Касбине,
// но и влияют на политику в хранении.
e.AddPolicy(...)
e.RemovePolicy(...)
For more examples, please see: https://github.com/casbin/xorm-adapter/blob/master/adapter_test.go
Как написать адаптер
Все адаптеры должны реализовать интерфейс Adapter , предоставив как минимум два обязательных метода:модель загрузки(модель). odel) ошибка
и SavePolicy(модель модели)
.
Остальные три функции являются факультативными. Они должны быть реализованы, если адаптер поддерживает функцию Auto-Save
.
Метод | Тип | Описание |
---|---|---|
LoadPolicy() | mandatory | Загрузить все правила политики из хранилища |
Сохранение политики () | mandatory | Сохранить все правила политики в хранилище |
AddPolicy() | опционально | Добавить правило политики в хранилище |
Удалить политику() | optional | Удалить правило политики из хранилища |
УдалитьFilteredPolicy() | optional | Удалить правила политики, соответствующие фильтру |
Если адаптер не поддерживает Автосохранение
, он должен обеспечить пустую реализацию для трех опциональных функций. Вот пример для Голанга:
// AddPolicy добавляет в хранилище правило политики.
func (a *Adapter) AddPolicy(sec string, ptype string, rule []string) error {
return errors. ew("не реализован")
}
// RemovePolicy удаляет правило политики из хранилища.
func (a *Adapter) RemovePolicy(sec string, ptype string, rule []string) error {
return errors. ew("не реализован")
}
// RemoveFilteredPolicy удаляет правила, соответствующие фильтру из хранилища.
func (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) error {
return errors.New("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
требуетфильтр
в качестве параметра. Фильтр должен быть чем-то подобным.{
"p":[ [ "alice" ], [ "bob" ] ],
"g":[ [ "", "book_group" ], [ "", "pen_group" ] ],
"g2":[ [ "alice" ] ]
}
Кто несет ответственность за создание БД?
Как конвенция, адаптер должен быть способен автоматически создавать базу данных с именем casbin
, если она не существует и использовать ее для хранения политики. Please use the Xorm adapter as a reference implementation: https://github.com/casbin/xorm-adapter
Context Adapter
ContextAdapter provides a context-aware interface for Casbin adapters.
Through context, you can implement features such as timeout control for the Adapter API
Example
gormadapter supports adapter with context, the following is a timeout control implemented using context
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)
}
How to write an context adapter
ContextAdapter
API only has an extra layer of context processing than ordinary Adapter
API, and on the basis of implementing ordinary Adapter API, you can encapsulate your own processing logic for context
A simple reference to the gormadapter
: context_adapter.go