API Overview
Bu genel bakış sadece Casbin API'lerini nasıl kullanacağınızı gösterir ve Casbin'in nasıl kurulduğunu ya da nasıl çalıştığını açıklamaz. Bu eğitimleri şu adreste bulabilirsiniz: Casbin Kurulumu ve Casbin Nasıl Çalışır. Yani, bu eğitimi okumaya başladığınızda, Casbin'i kodunuza tamamen kurup içe aktardığınızı varsayıyoruz.
Zorunlu API
Casbin'in Zorunlu API'leriyle başlayalım. model.conf
dosyasından bir RBAC modeli yükleyeceğiz ve policy.csv
dosyasından politikalar yükleyeceğiz. Model sözdizimi hakkında buradan bilgi edinebilirsiniz ve bu öğreticide bunu ele almayacağız. Aşağıda verilen yapılandırma dosyalarını anlayabileceğinizi varsayıyoruz:
model.conf
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
policy.csv
p, admin, data1, read
p, admin, data1, write
p, admin, data2, read
p, admin, data2, write
p, alice, data1, read
p, bob, data2, write
g, amber, admin
g, abc, admin
Yapılandırma dosyalarını okuduktan sonra, lütfen aşağıdaki kodu okuyun.
// Load information from files.
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
log.Fatalf("Error, detail: %s", err)
}
ok, err := enforcer.Enforce("alice", "data1", "read")
Bu kod, erişim kontrol modelini ve politikaları yerel dosyalardan yükler. casbin.NewEnforcer()
fonksiyonu bir zorlayıcı döndürecektir. İki parametresini dosya yolları olarak tanıyacak ve oradan dosyaları yükleyecektir. İşlem sırasında oluşan hatalar err
değişkeninde saklanır. Bu kod, modeli ve politikaları yüklemek için varsayılan adaptörü kullanır ve tabii ki, aynı sonucu bir üçüncü taraf adaptör kullanarak da elde edebilirsiniz.
ok, err := enforcer.Enforce("alice", "data1", "read")
kodu, erişim izinlerini onaylamak için kullanılır. Eğer Alice read işlemiyle data1'e erişebiliyorsa, ok
'un dönüş değeri true
olacaktır; aksi takdirde false
olacaktır. Bu örnekte, ok
değeri true
'dur.
EnforceEx API
Bazen hangi politikanın isteğe izin verdiğini merak edebilirsiniz, bu yüzden EnforceEx()
fonksiyonunu hazırladık. Bunu şu şekilde kullanabilirsiniz:
ok, reason, err := enforcer.EnforceEx("amber", "data1", "read")
fmt.Println(ok, reason) // true [admin data1 read]
EnforceEx()
fonksiyonu, dönüş değeri reason
içinde tam politikayı döndürecektir. Bu örnekte, amber
bir admin
rolüdür, bu nedenle politik p, admin, data1, read
bu isteğin true
olmasına izin verdi. Bu kodun çıktısı yorum içinde.
Casbin, bu benzeri birçok API sağlamıştır. Bu API'ler temel olanlara bazı ek fonksiyonlar ekler. Bunlar şunları içerir:
ok, err := enforcer.EnforceWithMatcher(matcher, request)
Bu fonksiyon bir eşleştirici kullanır.
ok, reason, err := enforcer.EnforceExWithMatcher(matcher, request)
Bu,
EnforceWithMatcher()
veEnforceEx()
kombinasyonudur.boolArray, err := enforcer.BatchEnforce(requests)
Bu fonksiyon, bir iş listesi sağlar ve bir dizi döndürür.
Bu, Casbin'in basit bir kullanım örneğidir. Casbin'i bu API'leri kullanarak bir yetkilendirme sunucusu başlatmak için kullanabilirsiniz. Sonraki paragraflarda sizlere bazı diğer API türlerini göstereceğiz.
Yönetim API'si
Get API
Bu API'ler, politikalardaki belirli nesneleri almak için kullanılır. Bu örnekte, bir enforcer yüklüyoruz ve ondan bir şey alıyoruz.
Lütfen aşağıdaki koda göz atın:
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
allSubjects := enforcer.GetAllSubjects()
fmt.Println(allSubjects)
Önceki örneğe benzer şekilde, ilk dört satır yerel dosyalardan gerekli bilgileri yüklemek için kullanılır. Burada bunu daha fazla tartışmayacağız.
Kod allSubjects := enforcer.GetAllSubjects()
politikalar dosyasındaki tüm konuları alır ve bunları bir dizi olarak döndürür. Daha sonra bu diziyi yazdırırız.
Tipik olarak, kodun çıktısı şöyle olmalıdır:
[admin alice bob]
Ayrıca GetAllSubjects()
fonksiyonunu GetAllNamedSubjects()
olarak değiştirerek, şu anki adlandırılmış politikada geçen konuların listesini alabilirsiniz.
Benzer şekilde, Objects, Actions, Roles
için GetAll
fonksiyonları hazırladık. Bu fonksiyonlara erişmek için, fonksiyon adındaki Subject
kelimesini istenen kategoriyle değiştirmeniz yeterlidir.
Ek olarak, politikalar için daha fazla alıcı mevcuttur. Çağırma yöntemi ve dönüş değerleri yukarıda bahsedilenlerle benzerdir.
policy = e.GetPolicy()
politikadaki tüm yetkilendirme kurallarını alır.filteredPolicy := e.GetFilteredPolicy(0, "alice")
belirtilen alan filtreleriyle ilgili politika içindeki tüm yetkilendirme kurallarını alır.namedPolicy := e.GetNamedPolicy("p")
adlandırılmış politika içindeki tüm yetkilendirme kurallarını alır.filteredNamedPolicy = e.GetFilteredNamedPolicy("p", 0, "bob")
adlandırılmış politika içindeki belirtilen alan filtreleriyle tüm yetkilendirme kurallarını alır.groupingPolicy := e.GetGroupingPolicy()
politika içindeki tüm rol miras kurallarını alır.filteredGroupingPolicy := e.GetFilteredGroupingPolicy(0, "alice")
belirtilen alan filtreleriyle politika içindeki tüm rol miras kurallarını alır.namedGroupingPolicy := e.GetNamedGroupingPolicy("g")
politika içindeki tüm rol miras kurallarını alır.namedGroupingPolicy := e.GetFilteredNamedGroupingPolicy("g", 0, "alice")
belirtilen alan filtreleriyle politika içindeki tüm rol miras kurallarını alır.
Ekle, Sil, Güncelle API
Casbin, çalışma zamanında politikaları dinamik olarak eklemek, silmek veya değiştirmek için çeşitli API'ler sağlar.
Aşağıdaki kod, politikaları nasıl eklemek, kaldırmak ve güncellemek ve ayrıca bir politika olup olmadığını kontrol etmek için nasıl kullanılacağını gösterir:
// load information from files
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
// add a policy and use HasPolicy() to confirm
enforcer.AddPolicy("added_user", "data1", "read")
hasPolicy := enforcer.HasPolicy("added_user", "data1", "read")
fmt.Println(hasPolicy) // true, the policy was added successfully
// remove a policy and use HasPolicy() to confirm
enforcer.RemovePolicy("alice", "data1", "read")
hasPolicy = enforcer.HasPolicy("alice", "data1", "read")
fmt.Println(hasPolicy) // false, the policy was removed successfully
// update a policy and use HasPolicy() to confirm
enforcer.UpdatePolicy([]string{"added_user", "data1", "read"}, []string{"added_user", "data1", "write"})
hasPolicy = enforcer.HasPolicy("added_user", "data1", "read")
fmt.Println(hasPolicy) // false, the original policy has expired
hasPolicy = enforcer.HasPolicy("added_user", "data1", "write")
fmt.Println(hasPolicy) // true, the new policy is in effect
Bu API'leri kullanarak, politikalarınızı dinamik olarak düzenleyebilirsiniz. Benzer şekilde, FilteredPolicy, NamedPolicy, FilteredNamedPolicy, GroupingPolicy, NamedGroupingPolicy, FilteredGroupingPolicy, FilteredNamedGroupingPolicy
için benzer API'ler sağladık. Bunları kullanmak için, fonksiyon adındaki Policy
kelimesini uygun kategoriyle değiştirmek yeterlidir.
Ayrıca, parametreleri dizilere değiştirerek, politikalarınızı toplu olarak düzenleyebilirsiniz.
Örneğin, böyle fonksiyonlar düşünün:
enforcer.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})
Eğer Policy
yerine Policies
koyar ve parametreleri aşağıdaki gibi değiştirirsek:
enforcer.UpdatePolicies([][]string{{"eve", "data3", "read"}, {"jack", "data3", "read"}}, [][]string{{"eve", "data3", "write"}, {"jack", "data3", "write"}})
o zaman bu politikaları toplu olarak düzenleyebiliriz.
Aynı işlemler GroupingPolicy, NamedGroupingPolicy
için de uygulanabilir.
AddEx API
Casbin, kullanıcıların kuralları toplu olarak eklemeye yardımcı olmak için AddEx serisi API'leri sağlar.
AddPoliciesEx(rules [][]string) (bool, error)
AddNamedPoliciesEx(ptype string, rules [][]string) (bool, error)
AddGroupingPoliciesEx(rules [][]string) (bool, error)
AddNamedGroupingPoliciesEx(ptype string, rules [][]string) (bool, error)
SelfAddPoliciesEx(sec string, ptype string, rules [][]string) (bool, error)
Bu yöntemler ile Ex soneksi olmayan yöntemler arasındaki fark, eğer kurallardan biri zaten mevcutsa, hemen false dönmek yerine bir sonraki kuralı kontrol etmeye devam edecekleridir.
Örneğin, AddPolicies
ve AddPoliciesEx
'i karşılaştıralım.
Aşağıdaki kodu casbin altındaki teste kopyalayarak çalıştırabilir ve gözlemleyebilirsiniz.
func TestDemo(t *testing.T) {
e, err := NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
e.ClearPolicy()
e.AddPolicy("user1", "data1", "read")
fmt.Println(e.GetPolicy())
testGetPolicy(t, e, [][]string{{"user1", "data1", "read"}})
// policy {"user1", "data1", "read"} now exists
// Use AddPolicies to add rules in batches
ok, _ := e.AddPolicies([][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})
fmt.Println(e.GetPolicy())
// {"user2", "data2", "read"} failed to add because {"user1", "data1", "read"} already exists
// AddPolicies returns false and no other policies are checked, even though they may not exist in the existing ruleset
// ok == false
fmt.Println(ok)
testGetPolicy(t, e, [][]string{{"user1", "data1", "read"}})
// Use AddPoliciesEx to add rules in batches
ok, _ = e.AddPoliciesEx([][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})
fmt.Println(e.GetPolicy())
// {"user2", "data2", "read"} is added successfully
// because AddPoliciesEx automatically filters the existing {"user1", "data1", "read"}
// ok == true
fmt.Println(ok)
testGetPolicy(t, e, [][]string{{"user1", "data1", "read"}, {"user2", "data2", "read"}})
}
RBAC API
Casbin, RBAC modelini ve politikalarını değiştirmeniz için size bazı API'ler sunar. Eğer RBAC'a aşinasanız, bu API'leri kolayca kullanabilirsiniz.
Burada, Casbin'in RBAC API'lerini nasıl kullanacağınızı gösteriyoruz ve RBAC'ın kendisinden bahsetmiyoruz. Daha fazla ayrıntıyı buradan alabilirsiniz.
Modeli ve politikaları, daha önce olduğu gibi yüklemek için aşağıdaki kodu kullanırız.
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
Ardından, bu API'lere erişmek için enforcer
adlı bir Enforcer örneği kullanabiliriz.
roles, err := enforcer.GetRolesForUser("amber")
fmt.Println(roles) // [admin]
users, err := enforcer.GetUsersForRole("admin")
fmt.Println(users) // [amber abc]
GetRolesForUser()
bir dizi döndürür ve bu dizi, amber'in sahip olduğu tüm rolleri içerir. Bu örnekte, amber'in sadece bir rolü vardır, ki bu da admin'dir, bu nedenle roles
dizisi [admin]
şeklindedir. Benzer şekilde, bir role ait kullanıcıları almak için GetUsersForRole()
kullanabilirsiniz. Bu fonksiyonun dönüş değeri de bir dizidir.
enforcer.HasRoleForUser("amber", "admin") // true
Bir kullanıcının rolün üyesi olup olmadığını doğrulamak için HasRoleForUser()
kullanabilirsiniz. Bu örnekte, amber admin'in bir üyesidir, bu nedenle fonksiyonun dönüş değeri true
şeklindedir.
fmt.Println(enforcer.Enforce("bob", "data2", "write")) // true
enforcer.DeletePermission("data2", "write")
fmt.Println(enforcer.Enforce("bob", "data2", "write")) // false
Bir izni silmek için DeletePermission()
kullanabilirsiniz.
fmt.Println(enforcer.Enforce("alice", "data1", "read")) // true
enforcer.DeletePermissionForUser("alice", "data1", "read")
fmt.Println(enforcer.Enforce("alice", "data1", "read")) // false
Ve bir kullanıcı için izni silmek için DeletePermissionForUser()
kullanabilirsiniz.
Casbin'in buna benzer birçok API'si bulunmaktadır. Çağırma yöntemleri ve dönüş değerleri, yukarıdaki API'lerle aynı stilde olup aynıdır. Bu API'leri sonraki belgelerde bulabilirsiniz.