Ana içeriğe atla

Adapters

Casbin'de, politika depolama bir adaptör (Casbin için ara yazılım olarak da bilinir) olarak uygulanmıştır. Bir Casbin kullanıcısı, politika kurallarını bir depolamadan yüklemek (yani LoadPolicy()) veya onlara kaydetmek (yani SavePolicy()) için bir adaptör kullanabilir. Hafif tutmak için, adaptör kodunu ana kütüphanede tutmuyoruz.

Desteklenen adaptörler

Casbin adaptörlerinin tam listesi aşağıda sunulmuştur. Yeni bir adaptör üzerine herhangi bir 3. parti katkıya açıkız, lütfen bize bildirin ve bunu bu listeye ekleyeceğiz:

AdapterTypeAuthorAutoSaveDescription
File Adapter (built-in)FileCasbinFor .CSV (Comma-Separated Values) files
Filtered File Adapter (built-in)File@faceless-saintFor .CSV (Comma-Separated Values) files with policy subset loading support
SQL AdapterSQL@Blank-XuMySQL, PostgreSQL, SQL Server, SQLite3 are supported in master branch and Oracle is supported in oracle branch by database/sql
Xorm AdapterORMCasbinMySQL, PostgreSQL, TiDB, SQLite, SQL Server, Oracle are supported by Xorm
GORM AdapterORMCasbinMySQL, PostgreSQL, Sqlite3, SQL Server are supported by GORM
GORM Adapter ExORMCasbinMySQL, PostgreSQL, Sqlite3, SQL Server are supported by GORM
Ent AdapterORMCasbinMySQL, MariaDB, PostgreSQL, SQLite, Gremlin-based graph databases are supported by ent ORM
Beego ORM AdapterORMCasbinMySQL, PostgreSQL, Sqlite3 are supported by Beego ORM
SQLX AdapterORM@memweyMySQL, PostgreSQL, SQLite, Oracle are supported by SQLX
Sqlx AdapterORM@Blank-XuMySQL, PostgreSQL, SQL Server, SQLite3 are supported in master branch and Oracle is supported in oracle branch by sqlx
GF ORM AdapterORM@vance-liuMySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
GoFrame ORM AdapterORM@kotlin2018MySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
gf-adapterORM@zcycMySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
Gdb AdapterORM@jxo-meMySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
GoFrame V2 AdapterORM@hailazMySQL, SQLite, PostgreSQL, Oracle, SQL Server are supported by GoFrame ORM
Bun AdapterORM@JunNishimuraMySQL, SQLite, PostgreSQL, SQL Server are supported by Bun ORM
Filtered PostgreSQL AdapterSQLCasbinFor PostgreSQL
Filtered pgx AdapterSQL@pckhoiPostgreSQL is supported by pgx
PostgreSQL AdapterSQL@cychiuaeFor PostgreSQL
RQLite AdapterSQLEDOMO SystemsFor RQLite
MongoDB AdapterNoSQLCasbinFor MongoDB based on MongoDB Go Driver
RethinkDB AdapterNoSQL@adityapandey9For RethinkDB
Cassandra AdapterNoSQLCasbinFor Apache Cassandra DB
DynamoDB AdapterNoSQLHOOQFor Amazon DynamoDB
DynacasbinNoSQLNewbMiaoFor Amazon DynamoDB
ArangoDB AdapterNoSQL@adamwasilaFor ArangoDB
Amazon S3 AdapterCloudSolutoFor Minio and Amazon S3
Go CDK AdapterCloud@bartventerAdapter based on Go Cloud Dev Kit that supports: Amazon DynamoDB, Azure CosmosDB, GCP Firestore, MongoDB, In-Memory
Azure Cosmos DB AdapterCloud@spacycoderFor Microsoft Azure Cosmos DB
GCP Firestore AdapterCloud@reedomFor Google Cloud Platform Firestore
GCP Cloud Storage AdapterCloudquramiFor Google Cloud Platform Cloud Storage
GCP Cloud Spanner AdapterCloud@flowerinthenightFor Google Cloud Platform Cloud Spanner
Consul AdapterKV store@ankitm123For HashiCorp Consul
Redis Adapter (Redigo)KV storeCasbinFor Redis
Redis Adapter (go-redis)KV store@mlsenFor Redis
Etcd AdapterKV store@sebastianliuFor etcd
BoltDB AdapterKV store@spezaFor Bolt
Bolt AdapterKV store@wirepairFor Bolt
BadgerDB AdapterKV store@initsFor BadgerDB
Protobuf AdapterStreamCasbinFor Google Protocol Buffers
JSON AdapterStringCasbinFor JSON
String AdapterString@qiangmzsxFor String
HTTP File AdapterHTTP@h4ckednekoFor http.FileSystem
FileSystem AdapterFile@nauconFor fs.FS and embed.FS
not
  1. casbin.NewEnforcer() açık veya örtük bir adaptörle çağrılırsa, politika otomatik olarak yüklenecektir.
  2. Politika kurallarını depolama alanından yeniden yüklemek için e.LoadPolicy() çağırabilirsiniz.
  3. Adaptör Otomatik-Kaydet özelliğini desteklemiyorsa, politika kurallarını eklediğinizde veya kaldırdığınızda otomatik olarak depolamaya geri kaydedilemez. Tüm politika kurallarını kaydetmek için SavePolicy() işlevini manuel olarak çağırmalısınız.

Örnekler

Burada birkaç örnek sunuyoruz:

Dosya adaptörü (yerleşik)

Aşağıda yerleşik dosya adaptöründen bir enforcer'ın nasıl başlatılacağı gösterilmektedir:

import "github.com/casbin/casbin"

e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")

Bu, şu ile aynıdır:

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 adaptörü

Aşağıda, bir MySQL veritabanından bir zorlayıcıyı nasıl başlatacağınız gösterilmektedir. 127.0.0.1:3306 adresindeki bir MySQL DB'ye root ve boş şifre ile bağlanır.

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)

Kendi depolama adaptörünüzü kullanın

Kendi adaptörünüzü aşağıdaki gibi kullanabilirsiniz:

import (
"github.com/casbin/casbin"
"github.com/your-username/your-repo"
)

a := yourpackage.NewAdapter(params)
e := casbin.NewEnforcer("examples/basic_model.conf", a)

Farklı adaptörler arasında taşıma/dönüştürme

Eğer adaptörü A'dan B'ye dönüştürmek istiyorsanız, şöyle yapabilirsiniz:

1.Politikayı A'dan belleğe yükle

e, _ := NewEnforcer(m, A)

veya

e.SetAdapter(A)
e.LoadPolicy()

2.adaptörünüzü A'dan B'ye dönüştürün

e.SetAdapter(B)

3.Politikayı bellekten B'ye kaydet

e.SavePolicy()

Çalışma zamanında yükle/kaydet

İlkizasyondan sonra modeli yeniden yüklemek, politikayı yeniden yüklemek veya politikayı kaydetmek isteyebilirsiniz:

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

OtomatikKaydet

Adaptörler için Otomatik-Kaydet adında bir özellik bulunmaktadır. Bir adaptör Otomatik-Kaydet özelliğini desteklediğinde, bu, tek bir politika kuralını depolamaya ekleyebilmesi veya tek bir politika kuralını depolamadan kaldırabilmesi anlamına gelir. Bu, SavePolicy()'den farklıdır, çünkü ikincisi depolamadaki tüm politika kurallarını siler ve Casbin zorlayıcısındaki tüm politika kurallarını depolamaya kaydeder. Bu nedenle, politika kurallarının sayısı büyük olduğunda performans sorunu yaşayabilir.

Adaptör Otomatik-Kaydet özelliğini desteklediğinde, bu seçeneği Enforcer.EnableAutoSave() fonksiyonu ile değiştirebilirsiniz. Seçenek varsayılan olarak etkinleştirilir (adaptör bunu destekliyorsa).

not
  1. Otomatik-Kaydet özelliği isteğe bağlıdır. Bir adaptör, bunu uygulamayı seçebilir veya seçmeyebilir.
  2. Otomatik-Kaydet, yalnızca Casbin zorlayıcısının kullandığı adaptör bunu desteklediğinde çalışır.
  3. Otomatik-Kaydet özelliğinin bir adaptör tarafından desteklenip desteklenmediğini görmek için yukarıdaki adaptör listesindeki OtomatikKaydet sütununa bakın.

Otomatik-Kaydet özelliğinin nasıl kullanılacağına dair bir örnek:

import (
"github.com/casbin/casbin"
"github.com/casbin/xorm-adapter"
_ "github.com/go-sql-driver/mysql"
)

// By default, the AutoSave option is enabled for an enforcer.
a := xormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/")
e := casbin.NewEnforcer("examples/basic_model.conf", a)

// Disable the AutoSave option.
e.EnableAutoSave(false)

// Because AutoSave is disabled, the policy change only affects the policy in Casbin enforcer,
// it doesn't affect the policy in the storage.
e.AddPolicy(...)
e.RemovePolicy(...)

// Enable the AutoSave option.
e.EnableAutoSave(true)

// Because AutoSave is enabled, the policy change not only affects the policy in Casbin enforcer,
// but also affects the policy in the storage.
e.AddPolicy(...)
e.RemovePolicy(...)

Daha fazla örnek için lütfen bakın: https://github.com/casbin/xorm-adapter/blob/master/adapter_test.go

Adaptör nasıl yazılır

Tüm adaptörler, en az iki zorunlu metodu sağlayarak Adapter arayüzünü uygulamalıdır: LoadPolicy(model model.Model) error ve SavePolicy(model model.Model) error.

Diğer üç fonksiyon isteğe bağlıdır. Bunlar, adaptör Otomatik Kaydet özelliğini destekliyorsa uygulanmalıdır.

YöntemTürAçıklama
LoadPolicy()zorunluTüm politikaları depodan yükle
SavePolicy()zorunluTüm politikaları depoya kaydet
AddPolicy()isteğe bağlıDepolamaya bir politika kuralı ekle
RemovePolicy()isteğe bağlıDepolamadan bir politika kuralını kaldır
RemoveFilteredPolicy()isteğe bağlıFiltreye uyan politika kurallarını depolamadan kaldır
not

Eğer bir adaptör Otomatik-Kaydet desteklemiyorsa, üç isteğe bağlı fonksiyon için boş bir uygulama sağlamalıdır. İşte Golang için bir örnek:

// AddPolicy adds a policy rule to the storage.
func (a *Adapter) AddPolicy(sec string, ptype string, rule []string) error {
return errors.New("not implemented")
}

// RemovePolicy removes a policy rule from the storage.
func (a *Adapter) RemovePolicy(sec string, ptype string, rule []string) error {
return errors.New("not implemented")
}

// RemoveFilteredPolicy removes policy rules that match the filter from the storage.
func (a *Adapter) RemoveFilteredPolicy(sec string, ptype string, fieldIndex int, fieldValues ...string) error {
return errors.New("not implemented")
}

Casbin uygulayıcı, bu üç isteğe bağlı fonksiyonu çağırırken "not implemented" hatasını görmezden gelecektir.

Bir adaptörün nasıl yazılacağıyla ilgili ayrıntılar var.

  • Veri Yapısı. Adaptör, en az altı sütunu okumayı desteklemelidir.
  • Veritabanı Adı. Varsayılan veritabanı adı casbin olmalıdır.
  • Tablo Adı. Varsayılan tablo adı casbin_rule olmalıdır.
  • Ptype Sütunu. Bu sütunun adı ptype olmalı, p_type veya Ptype yerine.
  • Tablo tanımı şu şekilde olmalı: (id int primary key, ptype varchar, v0 varchar, v1 varchar, v2 varchar, v3 varchar, v4 varchar, v5 varchar).
  • Benzersiz anahtar indeksi, ptype, v0, v1, v2, v3, v4, v5 sütunları üzerinde oluşturulmalıdır.
  • LoadFilteredPolicy, bir filter parametresi gerektirir. Filtre şöyle bir şey olmalı.
{
"p":[ [ "alice" ], [ "bob" ] ],
"g":[ [ "", "book_group" ], [ "", "pen_group" ] ],
"g2":[ [ "alice" ] ]
}

Veritabanını kim oluşturmakla sorumludur?

Bir kural olarak, adaptör, eğer mevcut değilse otomatik olarak casbin adında bir veritabanı oluşturabilmeli ve politika depolama için kullanmalıdır. Lütfen referans uygulama olarak Xorm adaptörünü kullanın: https://github.com/casbin/xorm-adapter

Bağlam Adaptörü

ContextAdapter, Casbin adaptörleri için bağlam-bilge bir arayüz sağlar.

Bağlam aracılığıyla, Adapter API için zaman aşımı kontrolü gibi özellikler uygulayabilirsiniz.

Örnek

gormadapter, bağlam ile uyumlu bir adaptörü destekler, aşağıda bağlam kullanılarak uygulanan bir zaman aşımı kontrolü bulunmaktadır.

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)
}

Bağlam adaptörü nasıl yazılır

ContextAdapter API, sadece sıradan Adapter API'ye göre ekstra bir bağlam işleme katmanına sahiptir ve sıradan Adapter API'yi uygulamanın üzerine kendi bağlam işleme mantığınızı kapsülleyebilirsiniz.

gormadapter için basit bir referans: adapter.go