Перейти к основному контенту

Адаптеры

В Касбине хранилища политики реализованы как адаптер (aka middleware for Casbin). Пользователь Casbin может использовать адаптер для загрузки правил политики хранения (aka LoadPolicy()), или сохранить правила политики к ней (aka SavePolicy()). Чтобы сохранить легкий вес, мы не ставим код адаптера в основную библиотеку.

Поддерживаемые адаптеры

Полный список адаптеров Casbin приводится ниже. Любой вклад сторонних разработчиков на новом адаптере приветствуется, пожалуйста, сообщите нам, и мы поместим его в этот список:)

АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbinДля .CSV (запятые значения) файлов
Фильтрованный файловый адаптер (встроенный)Файл@faceless-saintДля .CSV (Значения, разделенные запятыми) файлов с поддержкой загрузки подмножеств политики
SQL адаптерSQL@Blank-XuMySQL, PostgreSQL, SQL Server, SQLite3 поддерживаются в master ветке и Oracle поддерживается в ветке oracle database/sql
Адаптер XormORMCasbinMySQL, PostgreSQL, TiDB, SQLite, SQL Server, Oracle поддерживаются Xorm
Адаптер ГормаORMCasbinMySQL, PostgreSQL, Sqlite3, SQL Server поддерживаются Gorm
Конец адаптераORMCasbinБазы данных MySQL, MariaDB, PostgreSQL, SQLite, на базе Gremlin, поддерживаются ent ORM
Адаптер Beego ORMORMCasbinMySQL, PostgreSQL, Sqlite3 поддерживаются Beego ORM
Адаптер SQLXORM@memweyMySQL, PostgreSQL, SQLite, Oracle поддерживаются SQLX
Адаптер SqlxSQL@Blank-XuMySQL, PostgreSQL, SQL Server, SQLite3 поддерживаются в master ветке и Oracle поддерживается в ветке oracle sqlx
Адаптер GF ORMORM@vance-liuMySQL, SQLite, PostgreSQL, Oracle, SQL Server поддерживаются GoFrame ORM
GoFrame ORM адаптерORM@kotlin2018MySQL, SQLite, PostgreSQL, Oracle, SQL Server поддерживаются GoFrame ORM
Фильтрованный адаптер PostgreSQLSQLCasbinДля PostgreSQL
Фильтрованный адаптер pgxSQL@pckhoiPostgreSQL поддерживается pgx
Адаптер PostgreSQLSQL@cychiuaeДля PostgreSQL
Адаптер RQLiteSQLEDOMO СистемаДля RQLite
MongoDB AdapterNoSQLCasbinДля MongoDB на основе MongoDB Go Driver
Адаптер RethinkDBNoSQL@adityapandey9Для RethinkDB
Адаптер КассандрыNoSQLCasbinДля БД Apache Cassandra
Динамический адаптерNoSQLHOOQДля Amazon DynamoDB
DynacasbinNoSQLНьюбМиаДля Amazon DynamoDB
АрангоБД адаптерNoSQL@adamwasilaДля АрангоБД
Amazon S3 адаптерОблакоСолютоДля Minio и Amazon S3
Адаптер космоса AzureОблако@spacycoderДля Microsoft Azure Cosmos
GCP Фиолетовый адаптерОблако@reedomДля облачной платформы Google
Мобильный адаптер хранилища GCPОблакоquramiДля облачного хранилища Google Cloud
Встроенный адаптер GCP Cloud SpannerОблако@flowerinthenthenightОблачная платформа Google Cloud
Адаптер консулаМагазин KV@ankitm123Консул HashiCorp
Адаптер Redis (Redigo)Магазин KVCasbinДля Redis
Адаптер Redis (передис)Магазин KV@mlsenДля Redis
Адаптер EtcdМагазин KV@sebastianliuДля etcd
Адаптер BoltDBМагазин KV@spezaДля Bolt
Адаптер BoltМагазин KV@wirepairДля Bolt
Адаптер BadgerDBМагазин KV@initsДля BadgerDB
Протобуф-адаптерПотокCasbinДля Google протокола буферов
JSON адаптерСтрокаCasbinДля JSON
Адаптер строкиСтрока@qiangmzsxДля строки
HTTP файл адаптерHTTP@h4ckednekoДля http.FileSystem
Адаптер файловой системыФайл@nauconДля fs.FS и embed.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. он соединяется с MySQL DB на 127.0.0.1:3306 с паролем 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()

// Сохраняем текущую политику (обычно после изменения с API Касбина) обратно в файл/базу данных.
e.SavePolicy()

AutoSave

Есть возможность Автосохранение для адаптеров. Когда адаптер поддерживает Автосохранение, это означает, что он может поддерживать добавление единого правила политики для хранения или удаление одного правила политики из хранилища. Это в отличие от SavePolicy(), потому что последний удалит все правила политики хранения и сохранит все правила политики из Касбина в хранилище. Таким образом, он может пострадать от проблем с эффективностью, когда количество правил политики является большим.

Когда адаптер поддерживает Автосохранение, вы можете переключить эту опцию через функцию Enforcer.EnableAutoSave(). По умолчанию эта опция включена (если адаптер поддерживает ее).

note
  1. Функция Автосохранение является необязательной. Адаптер может выбрать для реализации его или нет.
  2. Автосохранение работает только для правоохранителя Касбина, когда адаптер использует его.
  3. Смотрите столбец Автосохранение в приведенном выше списке адаптеров, чтобы увидеть, поддерживается ли Автосохранение адаптером.

Вот пример использования Автосохранения:

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

Для получения дополнительных примеров см. https://github.com/casbin/xorm-adapter/blob/master/adapter_test.go

Как написать адаптер

Все адаптеры должны реализовать интерфейс Adapter , предоставив как минимум два обязательных метода:модель загрузки(модель). odel) ошибка и SavePolicy(модель модели).

Остальные три функции являются факультативными. Они должны быть реализованы, если адаптер поддерживает функцию Auto-Save.

МетодТипОписание
LoadPolicy()mandatoryЗагрузить все правила политики из хранилища
Сохранение политики ()mandatoryСохранить все правила политики в хранилище
AddPolicy()опциональноДобавить правило политики в хранилище
Удалить политику()опциональноУдалить правило политики из хранилища
УдалитьFilteredPolicy()опциональноУдалить правила политики, соответствующие фильтру
note

Если адаптер не поддерживает Автосохранение, он должен обеспечить пустую реализацию для трех опциональных функций. Вот пример для Голанга:

// 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 , если она не существует и использовать ее для хранения политики. Пожалуйста, используйте Xorm адаптер в качестве справочной реализации: https://github.com/casbin/xorm-adapter