RBAC
Takrifan Peranan
[role_definition]
digunakan untuk menentukan hubungan warisan peranan RBAC. Casbin menyokong pelbagai contoh sistem RBAC, di mana pengguna boleh mempunyai peranan dan hubungan warisan mereka, dan sumber juga boleh mempunyai peranan serta hubungan warisan mereka. Kedua-dua sistem RBAC ini tidak akan mengganggu antara satu sama lain.
Bahagian ini adalah pilihan. Jika anda tidak menggunakan peranan RBAC dalam model, maka tinggalkan bahagian ini.
[role_definition]
g = _, _
g2 = _, _
Takrifan peranan di atas menunjukkan bahawa g
adalah sistem RBAC, dan g2
adalah sistem RBAC yang lain. _,_
bermakna terdapat dua pihak yang terlibat dalam hubungan warisan. Dalam kes yang paling biasa, anda biasanya menggunakan g
sahaja jika anda hanya memerlukan peranan untuk pengguna. Anda juga boleh menggunakan kedua-dua g
dan g2
apabila anda memerlukan peranan (atau kumpulan) untuk kedua-dua pengguna dan sumber. Sila lihat rbac_model.conf dan rbac_model_with_resource_roles.conf untuk contoh.
Casbin menyimpan pemetaan peranan pengguna sebenar (atau pemetaan peranan sumber jika anda menggunakan peranan pada sumber) dalam dasar. Contohnya:
p, data2_admin, data2, read
g, alice, data2_admin
Ini bermakna alice
mewarisi/adalah ahli peranan data2_admin
. Di sini, alice
boleh menjadi pengguna, sumber, atau peranan. Casbin hanya mengenali ia sebagai rentetan.
Kemudian, dalam penapis, anda perlu memeriksa peranan seperti yang ditunjukkan di bawah:
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
Ini bermakna bahawa sub
dalam permintaan harus mempunyai peranan sub
dalam dasar.
- Casbin hanya menyimpan pemetaan pengguna-peranan.
- Casbin tidak mengesahkan sama ada pengguna itu adalah pengguna yang sah atau peranan itu adalah peranan yang sah. Itu harus dijaga oleh pengesahan.
- Jangan gunakan nama yang sama untuk pengguna dan peranan dalam sistem RBAC, kerana Casbin mengenali pengguna dan peranan sebagai rentetan, dan tidak ada cara untuk Casbin mengetahui sama ada anda menentukan pengguna
alice
atau perananalice
. Anda boleh menyelesaikannya dengan mudah dengan menggunakanrole_alice
. - Jika
A
mempunyai perananB
, danB
mempunyai perananC
, makaA
mempunyai perananC
. Keterusan ini adalah tidak terhingga buat masa ini.
Secara konvensional, nama token subjek dalam definisi polisi adalah sub
dan diletakkan di awal. Sekarang, Golang Casbin menyokong nama token dan tempat yang disesuaikan. Jika nama token subjek adalah sub
, token subjek boleh diletakkan di tempat sewenang-wenangnya tanpa tindakan tambahan yang diperlukan. Jika nama token subjek bukan sub
, e.SetFieldIndex()
untuk constant.SubjectIndex
harus dipanggil selepas enforcer diinisialisasi, tanpa mengira kedudukannya.
# `subject` here is for sub
[policy_definition]
p = obj, act, subject
e.SetFieldIndex("p", constant.SubjectIndex, 2) // index starts from 0
ok, err := e.DeleteUser("alice") // without SetFieldIndex, it will raise an error
Hierarki Peranan
Casbin's RBAC menyokong ciri hierarki peranan RBAC1, yang bermaksud jika alice
mempunyai role1
, dan role1
mempunyai role2
, maka alice
juga akan mempunyai role2
dan mewarisi kebenarannya.
Di sini, kita mempunyai konsep yang dipanggil tahap hierarki. Jadi, dalam contoh ini, tahap hierarki adalah 2. Untuk pengurus peranan terbina dalam Casbin, anda boleh menentukan tahap hierarki maksimum. Nilai lalai ialah 10. Ini bermakna pengguna akhir seperti alice
hanya boleh mewarisi 10 tahap peranan.
// NewRoleManager is the constructor for creating an instance of the
// default RoleManager implementation.
func NewRoleManager(maxHierarchyLevel int) rbac.RoleManager {
rm := RoleManager{}
rm.allRoles = &sync.Map{}
rm.maxHierarchyLevel = maxHierarchyLevel
rm.hasPattern = false
return &rm
}
Bagaimana Membezakan Peranan daripada Pengguna?
Casbin tidak membezakan antara peranan dan pengguna dalam RBAC-nya. Kedua-duanya dianggap sebagai rentetan. Jika anda hanya menggunakan RBAC satu tahap (di mana peranan tidak akan menjadi ahli peranan lain), anda boleh menggunakan e.GetAllSubjects()
untuk mendapatkan semua pengguna dan e.GetAllRoles()
untuk mendapatkan semua peranan. Mereka akan menyenaraikan semua u
dan semua r
, masing-masing, dalam semua peraturan g, u, r
.
Tetapi jika anda menggunakan RBAC berbilang tahap (dengan hierarki peranan) dan aplikasi anda tidak merekod sama ada nama (rentetan) adalah pengguna atau peranan, atau anda mempunyai pengguna dan peranan dengan nama yang sama, anda boleh menambah awalan kepada peranan seperti role::admin
sebelum menyampaikannya kepada Casbin. Dengan cara ini, anda akan tahu jika ia adalah peranan dengan memeriksa awalan ini.
Bagaimana untuk Membuat Pertanyaan Peranan atau Kebenaran Tersirat?
Apabila pengguna mewarisi peranan atau kebenaran melalui hierarki RBAC dan bukannya diberikan secara langsung dalam peraturan dasar, kami menyebut jenis tugasan ini sebagai "tak jelas" (implicit). Untuk menanyakan hubungan tak jelas (implicit) tersebut, anda perlu menggunakan dua API ini: GetImplicitRolesForUser()
dan GetImplicitPermissionsForUser()
dan bukannya GetRolesForUser()
dan GetPermissionsForUser()
. Untuk maklumat lebih lanjut, sila lihat isu GitHub ini.
Menggunakan Pemadanan Corak dalam RBAC
Lihat RBAC dengan Corak
Pengurus Peranan
Lihat bahagian Pengurus Peranan untuk butiran lanjut.