Ana içeriğe atla

How It Works

Casbin'de, bir erişim kontrol modeli, PERM metamodel (Policy, Effect, Request, Matchers) temel alınarak bir CONF dosyasına soyutlanır. Bir proje için yetkilendirme mekanizmasını değiştirmek veya yükseltmek, bir konfigürasyonu değiştirmek kadar basittir. Mevcut modelleri birleştirerek kendi erişim kontrol modelinizi özelleştirebilirsiniz. Örneğin, RBAC rollerini ve ABAC niteliklerini tek bir model içinde birleştirebilir ve aynı politika kurallarını paylaşabilirsiniz.

PERM modeli, Policy, Effect, Request ve Matchers olmak üzere dört temelden oluşur. Bu temeller, kaynaklar ve kullanıcılar arasındaki ilişkiyi tanımlar.

Request

Talep parametrelerini tanımlar. Temel bir talep, en azından bir konu (erişilen varlık), nesne (erişilen kaynak) ve eylem (erişim yöntemi) gerektiren bir demet nesnesidir.

Örneğin, bir talep tanımı şu şekilde görünebilir:

Bu tanım, erişim kontrolü eşleştirme fonksiyonu tarafından gerekli olan parametre adlarını ve sıralamayı belirtir.

Policy

Erişim stratejisi için modeli tanımlar. Politika kuralı belgesindeki alanların adını ve sırasını belirtir.

Örneğin:

Not: Eğer eft (politika sonucu) tanımlanmamışsa, politika dosyasındaki sonuç alanı okunmayacak ve eşleşen politika sonucu varsayılan olarak izin verilecektir.

Matcher

İstek ve Politika için eşleştirme kurallarını tanımlar.

Örneğin: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj Stratejinin sonucu p.eft içinde saklanacaktır.

Effect

Eşleştiricilerin eşleşme sonuçları üzerinde mantıksal bir kombinasyon yargısı yapar.

Örneğin: e = some(where(p.eft == allow))

Bu ifade, eşleştirme stratejisi sonucu p.eft (bazıları) izin verme sonucuna sahipse, nihai sonucun doğru olduğu anlamına gelir.

Başka bir örneğe bakalım:

e = some(where (p.eft == allow)) && !some(where (p.eft == deny))

Bu örnek kombinasyonun mantıksal anlamı şudur: eğer "izin ver" sonucuyla eşleşen bir strateji varsa ve "reddet" sonucuyla eşleşen bir strateji yoksa, sonuç doğrudur. Başka bir deyişle, eşleşen stratejilerin tümü "izin ver" ise doğrudur. Eğer herhangi bir "reddet" varsa, ikisi de yanlıştır (daha basit bir ifadeyle, "izin ver" ve "reddet" aynı anda mevcutsa, "reddet" önceliklidir).

Casbin'deki en temel ve basit model ACL'dir. ACL için model CONF şu şekildedir:

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

# Policy effect
[policy_effect]
e = some(where (p.eft == allow))

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

ACL modeli için bir örnek politika şudur:

p, alice, data1, read
p, bob, data2, write

Bu şu anlama gelir:

  • alice data1'i okuyabilir
  • bob data2'ye yazabilir

Ayrıca sonuna '' ekleyerek çok satırlı modu da destekliyoruz:

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act

Ayrıca, ABAC kullanıyorsanız, Casbin'in golang sürümü için aşağıdaki örnekte gösterildiği gibi 'in' operatörünü deneyebilirsiniz (jCasbin ve Node-Casbin henüz desteklenmemektedir):

# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')

Ancak, dizinin uzunluğunun 1'DEN FAZLA olduğundan EMİN OLMALISINIZ, aksi takdirde bir panik oluşturacaktır.

Diğer operatörler için govaluate'ye göz atabilirsiniz.