Langkau ke kandungan utama

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.

nota
  1. Casbin hanya menyimpan pemetaan pengguna-peranan.
  2. Casbin tidak mengesahkan sama ada pengguna itu adalah pengguna yang sah atau peranan itu adalah peranan yang sah. Itu harus dijaga oleh pengesahan.
  3. 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 peranan alice. Anda boleh menyelesaikannya dengan mudah dengan menggunakan role_alice.
  4. Jika A mempunyai peranan B, dan B mempunyai peranan C, maka A mempunyai peranan C. Keterusan ini adalah tidak terhingga buat masa ini.
Konvensyen Nama Token

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.