API Overview
Gambaran ini hanya menunjukkan kepada anda cara menggunakan API Casbin dan tidak menerangkan bagaimana Casbin dipasang atau bagaimana ia berfungsi. Anda boleh mencari tutorial tersebut di sini: Pemasangan Casbin dan Cara Casbin Berfungsi. Oleh itu, apabila anda mula membaca tutorial ini, kami menganggap bahawa anda telah memasang dan mengimport Casbin sepenuhnya ke dalam kod anda.
Lakukan API
Mari kita mulai dengan API Lakukan Casbin. Kami akan memuatkan model RBAC dari model.conf
dan memuatkan polisi dari policy.csv
. Anda boleh belajar tentang sintaks Model di sini, dan kami tidak akan membincangkannya dalam tutorial ini. Kami menganggap bahawa anda boleh memahami fail konfigurasi yang diberikan di bawah:
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
Selepas membaca fail konfigurasi, sila baca kod berikut.
// 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")
Kod ini memuatkan model kawalan akses dan polisi dari fail lokal. Fungsi casbin.NewEnforcer()
akan mengembalikan enforcer. Ia akan mengenali dua parameternya sebagai laluan fail dan memuatkan fail dari sana. Ralat yang berlaku dalam proses ini disimpan dalam pemboleh ubah err
. Kod ini menggunakan penyesuai lalai untuk memuatkan model dan dasar, dan tentu saja, anda boleh mencapai hasil yang sama dengan menggunakan penyesuai pihak ketiga.
Kod ok, err := enforcer.Enforce("alice", "data1", "read")
digunakan untuk mengesahkan kebenaran akses. Jika Alice boleh mengakses data1 dengan operasi baca, nilai yang dikembalikan oleh ok
akan menjadi true
; jika tidak, ia akan menjadi false
. Dalam contoh ini, nilai ok
adalah true
.
EnforceEx API
Kadang kala anda mungkin tertanya-tanya dasar mana yang membenarkan permintaan, jadi kami telah menyediakan fungsi EnforceEx()
. Anda boleh menggunakannya seperti ini:
ok, reason, err := enforcer.EnforceEx("amber", "data1", "read")
fmt.Println(ok, reason) // true [admin data1 read]
Fungsi EnforceEx()
akan mengembalikan rentetan dasar yang tepat dalam nilai kembali reason
. Dalam contoh ini, amber
mempunyai peranan admin
, jadi polisi p, admin, data1, read
membenarkan permintaan ini menjadi true
. Output kod ini ada dalam komen.
Casbin telah menyediakan banyak API yang serupa dengan ini. API ini menambah beberapa fungsi tambahan kepada yang asas. Antara lain:
ok, err := enforcer.EnforceWithMatcher(matcher, request)
Fungsi ini menggunakan pencocok.
ok, reason, err := enforcer.EnforceExWithMatcher(matcher, request)
Ini adalah gabungan
EnforceWithMatcher()
danEnforceEx()
.boolArray, err := enforcer.BatchEnforce(requests)
Fungsi ini membolehkan senarai pekerjaan dan mengembalikan array.
Ini adalah kes penggunaan mudah Casbin. Anda boleh menggunakan Casbin untuk memulakan pelayan pengkalan dengan menggunakan API ini. Kami akan menunjukkan kepada anda beberapa jenis API lain dalam perenggan berikut.
API Pengurusan
API Dapatkan
API ini digunakan untuk mengambil objek tertentu dalam dasar. Dalam contoh ini, kami memuatkan enforcer dan mengambil sesuatu daripadanya.
Sila lihat kod berikut:
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)
Serupa dengan contoh sebelumnya, empat baris pertama digunakan untuk memuatkan maklumat yang diperlukan dari fail tempatan. Kami tidak akan membincangkan perkara itu di sini lagi.
Kod allSubjects := enforcer.GetAllSubjects()
mengambil semua subjek dalam fail polisi dan mengembalikannya sebagai array. Kami kemudian mencetak array tersebut.
Biasanya, output kod tersebut sepatutnya:
[admin alice bob]
Anda juga boleh menukar fungsi GetAllSubjects()
kepada GetAllNamedSubjects()
untuk mendapatkan senarai subjek yang muncul dalam polisi bernama semasa.
Begitu juga, kami telah menyediakan fungsi GetAll
untuk Objects, Actions, Roles
. Untuk mengakses fungsi-fungsi ini, anda hanya perlu menggantikan perkataan Subject
dalam nama fungsi dengan kategori yang diinginkan.
Selain itu, terdapat lebih banyak getter yang tersedia untuk polisi. Kaedah panggilan dan nilai pulangan adalah serupa dengan yang dinyatakan di atas.
policy = e.GetPolicy()
mengambil semua peraturan kebenaran dalam polisi.filteredPolicy := e.GetFilteredPolicy(0, "alice")
mengambil semua peraturan keizinan dalam dasar dengan penapis medan yang ditentukan.namedPolicy := e.GetNamedPolicy("p")
mengambil semua peraturan keizinan dalam dasar bernama.filteredNamedPolicy = e.GetFilteredNamedPolicy("p", 0, "bob")
mengambil semua peraturan keizinan dalam dasar bernama dengan penapis medan yang ditentukan.groupingPolicy := e.GetGroupingPolicy()
mengambil semua peraturan warisan peranan dalam dasar.filteredGroupingPolicy := e.GetFilteredGroupingPolicy(0, "alice")
mengambil semua peraturan warisan peranan dalam dasar dengan penapis medan yang ditentukan.namedGroupingPolicy := e.GetNamedGroupingPolicy("g")
mengambil semua peraturan warisan peranan dalam dasar.namedGroupingPolicy := e.GetFilteredNamedGroupingPolicy("g", 0, "alice")
mengambil semua peraturan warisan peranan dalam dasar dengan penapis medan yang ditentukan.
Tambah, Hapus, Kemas Kini API
Casbin menyediakan pelbagai API untuk menambah, menghapus, atau mengubah suai dasar secara dinamik pada waktu runtime.
Kod berikut menunjukkan bagaimana untuk menambah, mengeluarkan, dan mengemas kini dasar, serta bagaimana untuk memeriksa sama ada dasar wujud:
// 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
Dengan menggunakan API ini, anda boleh mengedit polisi anda secara dinamik. Begitu juga, kami telah menyediakan API yang serupa untuk FilteredPolicy, NamedPolicy, FilteredNamedPolicy, GroupingPolicy, NamedGroupingPolicy, FilteredGroupingPolicy, FilteredNamedGroupingPolicy
. Untuk menggunakannya, gantikan sahaja perkataan Policy
dalam nama fungsi dengan kategori yang sesuai.
Selain itu, dengan mengubah parameter kepada tatasusunan, anda boleh melakukan pengeditan kumpulan polisi anda.
Sebagai contoh, pertimbangkan fungsi seperti ini:
enforcer.UpdatePolicy([]string{"eve", "data3", "read"}, []string{"eve", "data3", "write"})
Jika kita menukar Policy
kepada Policies
dan mengubah parameter seperti berikut:
enforcer.UpdatePolicies([][]string{{"eve", "data3", "read"}, {"jack", "data3", "read"}}, [][]string{{"eve", "data3", "write"}, {"jack", "data3", "write"}})
maka kita boleh melakukan pengeditan kumpulan polisi ini.
Operasi yang sama juga boleh dikenakan kepada GroupingPolicy, NamedGroupingPolicy
.
API AddEx
Casbin menyediakan siri API AddEx untuk membantu pengguna menambah peraturan secara kumpulan.
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)
Perbezaan antara kaedah-kaedah ini dan kaedah-kaedah tanpa akhiran Ex adalah bahawa jika salah satu peraturan sudah wujud, mereka akan terus menyemak peraturan seterusnya bukannya mengembalikan salah serta-merta.
Sebagai contoh, mari bandingkan AddPolicies
dan AddPoliciesEx
.
Anda boleh menjalankan dan mengamati kod berikut dengan menyalinnya ke dalam ujian di bawah casbin.
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 menyediakan beberapa API untuk anda mengubah model dan polisi RBAC. Jika anda biasa dengan RBAC, anda boleh menggunakan API ini dengan mudah.
Di sini, kami hanya menunjukkan kepada anda cara menggunakan API RBAC Casbin dan tidak akan membincangkan tentang RBAC itu sendiri. Anda boleh mendapatkan lebih banyak butiran di sini.
Kami menggunakan kod berikut untuk memuatkan model dan polisi, sama seperti sebelumnya.
enforcer, err := casbin.NewEnforcer("./example/model.conf", "./example/policy.csv")
if err != nil {
fmt.Printf("Error, details: %s\n", err)
}
Kemudian, kita boleh menggunakan contoh Enforcer enforcer
untuk mengakses API ini.
roles, err := enforcer.GetRolesForUser("amber")
fmt.Println(roles) // [admin]
users, err := enforcer.GetUsersForRole("admin")
fmt.Println(users) // [amber abc]
GetRolesForUser()
mengembalikan satu tatasusunan yang mengandungi semua peranan yang dimiliki oleh amber. Dalam contoh ini, amber hanya mempunyai satu peranan, iaitu admin, jadi tatasusunan roles
adalah [admin]
. Begitu juga, anda boleh menggunakan GetUsersForRole()
untuk mendapatkan pengguna yang tergolong dalam suatu peranan. Nilai pulangan fungsi ini juga adalah satu tatasusunan.
enforcer.HasRoleForUser("amber", "admin") // true
Anda boleh menggunakan HasRoleForUser()
untuk mengesahkan sama ada pengguna itu tergolong dalam peranan tersebut. Dalam contoh ini, amber adalah ahli dari admin, jadi nilai pulangan fungsi tersebut adalah true
.
fmt.Println(enforcer.Enforce("bob", "data2", "write")) // true
enforcer.DeletePermission("data2", "write")
fmt.Println(enforcer.Enforce("bob", "data2", "write")) // false
Anda boleh menggunakan DeletePermission()
untuk memadamkan satu kebenaran.
fmt.Println(enforcer.Enforce("alice", "data1", "read")) // true
enforcer.DeletePermissionForUser("alice", "data1", "read")
fmt.Println(enforcer.Enforce("alice", "data1", "read")) // false
Dan gunakan DeletePermissionForUser()
untuk memadamkan satu kebenaran untuk seorang pengguna.
Casbin mempunyai banyak API seperti ini. Kaedah pemanggilan dan nilai pulangan mereka mempunyai gaya yang sama dengan API di atas. Anda boleh mencari API ini dalam dokumen seterusnya.