RBAC
Definisi Peran
[role_definition]
digunakan untuk mendefinisikan hubungan pewarisan peran RBAC. Casbin mendukung beberapa instance sistem RBAC, di mana pengguna dapat memiliki peran dan hubungan pewarisannya, dan sumber daya juga dapat memiliki peran dan hubungan pewarisannya. Kedua sistem RBAC ini tidak akan mengganggu satu sama lain.
Bagian ini bersifat opsional. Jika Anda tidak menggunakan peran RBAC dalam model, maka lewati bagian ini.
[role_definition]
g = _, _
g2 = _, _
Definisi peran di atas menunjukkan bahwa g
adalah sistem RBAC, dan g2
adalah sistem RBAC lainnya. _,_
berarti ada dua pihak yang terlibat dalam hubungan pewarisan. Dalam kasus yang paling umum, Anda biasanya menggunakan g
sendiri jika Anda hanya memerlukan peran untuk pengguna. Anda juga dapat menggunakan g
dan g2
ketika Anda memerlukan peran (atau grup) untuk pengguna dan sumber daya. Silakan lihat rbac_model.conf dan rbac_model_with_resource_roles.conf untuk contoh.
Casbin menyimpan pemetaan peran pengguna aktual (atau pemetaan peran sumber daya jika Anda menggunakan peran pada sumber daya) dalam kebijakan. Sebagai contoh:
p, data2_admin, data2, read
g, alice, data2_admin
Ini berarti bahwa alice
mewarisi/menjadi anggota dari peran data2_admin
. Di sini, alice
bisa menjadi pengguna, sumber daya, atau peran. Casbin hanya mengenali itu sebagai sebuah string.
Kemudian, dalam sebuah matcher, Anda harus memeriksa peran seperti yang ditunjukkan di bawah ini:
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
Ini berarti bahwa sub
dalam permintaan harus memiliki peran sub
dalam kebijakan.
- Casbin hanya menyimpan pemetaan pengguna-peran.
- Casbin tidak memverifikasi apakah seorang pengguna adalah pengguna yang valid atau peran adalah peran yang valid. Itu harus diurus oleh autentikasi.
- Jangan gunakan nama yang sama untuk pengguna dan peran dalam sistem RBAC, karena Casbin mengenali pengguna dan peran sebagai string, dan tidak ada cara bagi Casbin untuk mengetahui apakah Anda menentukan pengguna
alice
atau peranalice
. Anda bisa menyelesaikannya dengan mudah dengan menggunakanrole_alice
. - Jika
A
memiliki peranB
, danB
memiliki peranC
, makaA
memiliki peranC
. Transitivity ini tak terbatas untuk saat ini.
Secara konvensional, nama token subjek dalam definisi kebijakan adalah sub
dan ditempatkan di awal. Sekarang, Golang Casbin mendukung nama token dan posisi yang disesuaikan. Jika nama token subjek adalah sub
, token subjek dapat ditempatkan di tempat yang sewenang-wenang tanpa perlu tindakan ekstra. Jika nama token subjek bukan sub
, e.SetFieldIndex()
untuk constant.SubjectIndex
harus dipanggil setelah enforcer diinisialisasi, terlepas dari posisinya.
# `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 Peran
RBAC Casbin mendukung fitur hierarki peran RBAC1, yang berarti jika alice
memiliki role1
, dan role1
memiliki role2
, maka alice
juga akan memiliki role2
dan mewarisi izin-izinnya.
Di sini, kita memiliki konsep yang disebut tingkat hierarki. Jadi, dalam contoh ini, tingkat hierarki adalah 2. Untuk manajer peran bawaan di Casbin, Anda dapat menentukan tingkat hierarki maksimum. Nilai defaultnya adalah 10. Ini berarti bahwa pengguna akhir seperti alice
hanya dapat mewarisi 10 tingkat peran.
// 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 Membedakan Peran dari Pengguna?
Casbin tidak membedakan antara peran dan pengguna dalam RBAC-nya. Keduanya diperlakukan sebagai string. Jika Anda hanya menggunakan RBAC satu tingkat (di mana sebuah peran tidak akan pernah menjadi anggota dari peran lain), Anda dapat menggunakan e.GetAllSubjects()
untuk mendapatkan semua pengguna dan e.GetAllRoles()
untuk mendapatkan semua peran. Mereka akan mencantumkan semua u
dan semua r
, masing-masing, dalam semua aturan g, u, r
.
Tetapi jika Anda menggunakan RBAC multi-tingkat (dengan hierarki peran) dan aplikasi Anda tidak mencatat apakah sebuah nama (string) adalah pengguna atau peran, atau Anda memiliki pengguna dan peran dengan nama yang sama, Anda dapat menambahkan awalan ke peran seperti role::admin
sebelum meneruskannya ke Casbin. Dengan cara ini, Anda akan tahu apakah itu adalah peran dengan memeriksa awalan ini.
Bagaimana Meminta Peran atau Izin Implisit?
Ketika pengguna mewarisi peran atau izin melalui hierarki RBAC alih-alih ditetapkan secara langsung dalam aturan kebijakan, kami menyebut jenis penetapan ini sebagai "implisit". Untuk menanyakan hubungan implisit tersebut, Anda perlu menggunakan dua API ini: GetImplicitRolesForUser()
dan GetImplicitPermissionsForUser()
alih-alih GetRolesForUser()
dan GetPermissionsForUser()
. Untuk detail lebih lanjut, silakan lihat issue GitHub ini.
Menggunakan Pencocokan Pola dalam RBAC
Lihat RBAC dengan Pola
Manajer Peran
Lihat bagian Manajer Peran untuk detailnya.