Casbin

Casbin

  • Документ
  • API
  • Редактор
  • Плагины IDE
  • Single Sign-On (SSO)
  • Форум
  • Справка
  • Блог
  • Pricing
  • Contact Sales
  • Languages iconРусский
    • English
    • 中文
    • 한국어
    • Français
    • Deutsch
    • 日本語
    • Помочь перевести
  • GitHub

›Расширения

Основы

  • Общий обзор
  • Начать работу
  • Как это работает
  • Уроки

Модель

  • Поддерживаемые модели
  • Синтаксис для моделей
  • Эффект
  • Функция
  • RBAC
  • RBAC with Pattern
  • RBAC с доменами
  • Casbin RBAC v.s. RBAC96
  • АДАТ
  • Приоритетная модель
  • Супер админ

Хранилище

  • Модель хранилища
  • Хранилище политики
  • Загрузка подмножества политик

Расширения

  • Enforcers
  • Адаптеры
  • Наблюдатели
  • Диспетчеры
  • Менеджеры ролей
  • Посредники
  • GraphQL Middlewares
  • Облачные Посредники

API

  • Обзор API
  • API управления
  • RBAC API
  • RBAC с доменным API
  • RoleManager API
  • Права доступа к данным

Расширенное использование

  • Многопоточность
  • Benchmarks
  • Оптимизация производительности
  • Авторизация Кубернетов
  • Авторизация служебной ячейки через посланника

Управление

  • Администратор портала
  • Служба Касбина
  • Обработка журнала и ошибок
  • Использование интерфейса

Редактор

  • Онлайн-редактор
  • Плагины IDE

Ещё

  • Наши усыновители
  • Вклад
  • Политика конфиденциальности
  • Условия предоставления услуг
Translate

Адаптеры

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

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

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

Go
Java
Node.js
PHP
Python
.NET
Rust
Ruby
Swift
Lua
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Фильтрованный файловый адаптер (встроенный)Файл@faceless-saint❌Для .CSV (Значения, разделенные запятыми) файлов с поддержкой загрузки подмножеств политики
SQL адаптерSQL@Blank-Xu✅MySQL, PostgreSQL, SQL Server, SQLite3 поддерживаются в master ветке и Oracle поддерживается в ветке oracle database/sql
Адаптер XormORMCasbin✅MySQL, PostgreSQL, TiDB, SQLite, SQL Server, Oracle поддерживаются Xorm
Адаптер ГормаORMCasbin✅MySQL, PostgreSQL, Sqlite3, SQL Server поддерживаются Gorm
Конец адаптераORMCasbin✅Базы данных MySQL, MariaDB, PostgreSQL, SQLite, на базе Gremlin, поддерживаются ent ORM
Адаптер Beego ORMORMCasbin✅MySQL, PostgreSQL, Sqlite3 поддерживаются Beego ORM
Адаптер SQLXORM@memwey✅MySQL, PostgreSQL, SQLite, Oracle поддерживаются SQLX
Адаптер SqlxSQL@Blank-Xu✅MySQL, PostgreSQL, SQL Server, SQLite3 поддерживаются в master ветке и Oracle поддерживается в ветке oracle sqlx
Адаптер GF ORMORM@vance-liu✅MySQL, SQLite, PostgreSQL, Oracle, SQL Server поддерживаются GoFrame ORM
GoFrame ORM адаптерORM@kotlin2018✅MySQL, SQLite, PostgreSQL, Oracle, SQL Server поддерживаются GoFrame ORM
Фильтрованный адаптер PostgreSQLSQLCasbin✅Для PostgreSQL
Фильтрованный адаптер pgxSQL@pckhoi✅PostgreSQL поддерживается 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
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Адаптер JDBCJDBCCasbin✅MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server поддерживаются JDBC
Спящий адаптерORMCasbin✅Oracle, DB2, SQL Server, Sybase, MySQL, PostgreSQL поддерживаются Hibernate
Мибатис АдаптерORMCasbin✅MySQL, Oracle, PostgreSQL, DB2, Sybase, SQL Server (то же что и JDBC) поддерживаются MyBatis 3
Адаптер ХутолаORM@mapleafgo✅MySQL, Oracle, PostgreSQL, SQLite поддерживается Hutool
MongoDB AdapterNoSQLCasbin✅MongoDB поддерживается mongodb-driver-sync
Динамический адаптерNoSQLCasbin❌Для Amazon DynamoDB
Адаптер RedisМагазин KVCasbin✅Для Redis
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Фильтрованный файловый адаптер (встроенный)ФайлCasbin❌Для .CSV (Значения, разделенные запятыми) файлов с поддержкой загрузки подмножеств политики
Адаптер строки (встроенный)Строка@calebfaruki❌Для строки
Базовый адаптерРодной ORMCasbin✅pg, mysql, mysql2, sqlite3, oracledb, mssql поддерживает сам адаптер
Последовательный адаптерORMCasbin✅MySQL, PostgreSQL, SQLite, Microsoft SQL Server поддерживаются Последовательность
Адаптер TypeORMORMCasbin✅MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL, MongoDB поддерживаются TypeORM
Адаптер ПризмаORMCasbin✅MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, AWS Aurora, Azure SQL поддерживаются Prisma
Адаптер KORM@sarneeh и тыс.✅MSSQL, MySQL, PostgreSQL, SQLite3, Oracle поддерживаются Knex.js
Адаптер Objection.jsORM@willsoto✅MSSQL, MySQL, PostgreSQL, SQLite3, Oracle поддерживаются Objection.js
Родной адаптер узла PostgreSQLSQL@touchifyapp✅PostgreSQL адаптер с поддержкой расширенной загрузки подмножества политик и улучшенной производительности, построенной на node-postgres.
Адаптер МонгозыNoSQLelastic.io и Касбин✅MongoDB поддерживается Mongoose
Адаптер Монгозы (Без транзакции)NoSQLminhducck✅MongoDB поддерживается Mongoose
Узел MongoDB Родной адаптерNoSQL@juicycleff✅Для родина узла MongoDB
Динамический адаптерNoSQL@fospitia✅Для Amazon DynamoDB
Адаптер базы купоновNoSQL@MarkMYoung✅Для Купона
Адаптер RedisМагазин KVCasbin❌Для Redis
Адаптер RedisМагазин KV@NandaKishorJeripothula❌Для Redis
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Адаптер базы данныхORMCasbin✅MySQL, PostgreSQL, SQLite, Microsoft SQL Server поддерживаются techone/database
Адаптер Zend DbORMCasbin✅MySQL, PostgreSQL, SQLite, Oracle, IBM DB2, Microsoft SQL Server, Other PDO Driver поддерживаются zend-db
Доктрин DBAL адаптер (рекомендуется)ORMCasbin✅Мощный абстрактный уровень PHP (DBAL) с множеством функций для управления схемой баз данных.
Adapter MedooORMCasbin✅Medoo - это легкий фреймворк базы данных PHP для ускорения разработки, поддерживает все базы данных SQL, включая MySQL, MSSQL, SQLite, MariaDB, PostgreSQL, Sybase, Oracle и больше.
Адаптер Laminas-dbORMCasbin✅MySQL, PostgreSQL, Oracle, IBM DB2, Microsoft Sql Server, PDO и др. поддерживаются ламинас-db
Адаптер Zend-dbORMCasbin✅MySQL, PostgreSQL, Oracle, IBM DB2, Microsoft Sql Server, PDO и др. поддерживаются zend-db
Адаптер RedisМагазин KV@nsnake❌Для Redis
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Адаптер SQLAlchemyORMCasbin✅PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase поддерживаются SQLAlchemy
Асинхронный адаптер баз данныхORMотборник✅PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase поддерживаются базами данных
Peewee адаптерORM@shblhy✅PostgreSQL, MySQL, SQLite поддерживается Peewee
Адаптер MongoEngineORM@zhangbailong945❌MongoDB поддерживается MongoEngine
Адаптер Pony ORMORM@drorvinkler✅MySQL, PostgreSQL, SQLite, Oracle, CockroachDB поддерживаются Pony ORM
Адаптер ORMORM@thearchitector✅PostgreSQL (>=9.4), MySQL, MariaDB и SQLite поддерживаются Tortoise ORM
Адаптер базы купоновNoSQLЛогика✅ (без remove_filtered_policy())Для Купона
Динамический адаптерNoSQL@abqadeer✅Для DynamoDB
Адаптер ПимонгоNoSQLCasbin❌MongoDB поддерживается Pymongo
GCP адаптер огненной базыОблако@devrushi41✅Для Google Cloud Platform Firebase
Async ormar AdapterORMsampingantech✅PostgreSQL, MySQL, SQLite, Oracle, Microsoft SQL Server, Firebird, Sybase are supported by ormar
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Адаптер EFORMCasbin❌MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, etc. поддерживаются Entity Framework 6
EFCore адаптерORMCasbin✅MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, etc. поддерживаются фреймворком сущности
EFCore Adapter (.NET Core 5)ORM@g4dvali✅MySQL, PostgreSQL, SQLite, Microsoft SQL Server, Oracle, DB2, etc. поддерживаются фреймворком сущности
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Адаптер дизеляORMCasbin✅SQLite, PostgreSQL, MySQL поддерживается дизелем
Адаптер SqlxORMCasbin✅PostgreSQL, MySQL поддерживается Sqlx с полностью асинхронной операцией
Морской адаптерORMlingdu1234✅PostgreSQL, MySQL поддерживается SeaORM с полностью асинхронной операцией
JSON адаптерСтрокаCasbin✅Для JSON
Адаптер YAMLСтрокаCasbin✅Для YAML
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Адаптер последовательностиORMCasbinRuby✅ADO, Amalgalite, IBM_DB, JDBC, MySQL, Mysql2, ODBC, Oracle, PostgreSQL, SQLAnywhere, SQLite3 и TinyTDS поддерживаются Sequel
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Адаптер памяти (встроенный)ПамятьCasbin❌За память
Флюантовый адаптерORMCasbin✅PostgreSQL, SQLite, MySQL, MongoDB поддерживаются Fluent
АдаптерТипАвторAutoSaveОписание
Файл адаптер (встроенный)ФайлCasbin❌Для .CSV (запятые значения) файлов
Фильтрованный файловый адаптер (встроенный)ФайлCasbin❌Для .CSV (Значения, разделенные запятыми) файлов с поддержкой загрузки подмножеств политики
Adapter LuaSQLORMCasbin✅MySQL, PostgreSQL, SQLite3 поддерживаются LuaSQL
4Дни адаптерORMCasbin✅MySQL, SQLite3 поддерживается 4DaysORM

::note

  1. Если casbin.NewEnforcer() вызывается с явным или неявным адаптером, политика будет загружена автоматически.
  2. Вы можете вызвать e.LoadPolicy() для перезагрузки правил политики из хранилища.
  3. Если адаптер не поддерживает функцию Автосохранения , Правила политики не могут быть автоматически сохранены в хранилище, когда вы добавляете или удаляете политики. Вы должны вызвать SavePolicy() вручную, чтобы сохранить все правила. :::

Примеры

Здесь мы приводим несколько примеров:

Файловый адаптер (встроен)

Ниже показано, как инициализировать усилитель из встроенного файлового адаптера:

Go
PHP
Rust
импортируйте "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.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()
  1. конвертируйте ваш адаптер из A в B

    e.SetAdapter(B)
    
  2. Сэкономьте политику в памяти B

    e. oadPolicy()
    

Загрузить/Сохранить при запуске

Вы также можете перезагрузить модель, перезагрузите политику или сохраните ее после инициализации:

// Перезагрузите модель из файла 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 (*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.
  • Политика загрузки требует фильтр в качестве параметра. Фильтр должен быть чем-то подобным. json { "p":[ "alice" ], [ "bob" ] ], "g":[ "", "book_group" ], [ "", "pen_group" ] ], "g2":[ "alice" ]

Кто несет ответственность за создание БД?

Как конвенция, адаптер должен быть способен автоматически создавать базу данных с именем casbin , если она не существует и использовать ее для хранения политики. Пожалуйста, используйте Xorm адаптер в качестве справочной реализации: https://github.com/casbin/xorm-adapter

← EnforcersНаблюдатели →
  • Поддерживаемые адаптеры
  • Примеры
    • Файловый адаптер (встроен)
    • MySQL adapter
  • Использовать собственный адаптер памяти
  • Переместить / преобразовать между разными адаптерами
  • Загрузить/Сохранить при запуске
  • AutoSave
    • Как написать адаптер
    • Кто несет ответственность за создание БД?
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