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.