Lewati ke konten utama

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.

catatan
  1. Casbin hanya menyimpan pemetaan pengguna-peran.
  2. Casbin tidak memverifikasi apakah seorang pengguna adalah pengguna yang valid atau peran adalah peran yang valid. Itu harus diurus oleh autentikasi.
  3. 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 peran alice. Anda bisa menyelesaikannya dengan mudah dengan menggunakan role_alice.
  4. Jika A memiliki peran B, dan B memiliki peran C, maka A memiliki peran C. Transitivity ini tak terbatas untuk saat ini.
Konvensi Nama Token

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.