RBAC with Domains
Definisi Peran dengan Penyewa Domain
Peran RBAC di Casbin bisa global atau spesifik domain. Peran spesifik domain berarti peran untuk pengguna bisa berbeda ketika pengguna berada di domain/penyewa yang berbeda. Ini sangat berguna untuk sistem besar seperti cloud, karena pengguna biasanya berada di penyewa yang berbeda.
Definisi peran dengan domain/penyewa seharusnya terlihat seperti ini:
[role_definition]
g = _, _, _
Yang ketiga _
mewakili nama domain/penyewa, dan bagian ini tidak boleh diubah. Kemudian kebijakan bisa menjadi:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
Ini berarti bahwa peran admin
di tenant1
dapat membaca data1
. Dan alice
memiliki peran admin
di tenant1
serta peran user
di tenant2
. Oleh karena itu, dia dapat membaca data1
. Namun, karena alice
bukan seorang admin
di tenant2
, dia tidak dapat membaca data2
.
Kemudian, dalam sebuah matcher, Anda harus memeriksa peran sebagai berikut:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Silakan merujuk ke rbac_with_domains_model.conf untuk contoh.
Catatan: Secara konvensional, nama token domain dalam definisi kebijakan adalah dom
dan ditempatkan sebagai token kedua (sub, dom, obj, act
).
Sekarang, Golang Casbin mendukung nama token dan penempatan kustom. Jika nama token domain adalah dom
, token domain dapat ditempatkan di posisi mana pun tanpa tindakan tambahan. Jika nama token domain bukan dom
, e.SetFieldIndex()
untuk constant.DomainIndex
harus dipanggil setelah enforcer diinisialisasi, terlepas dari posisinya.
# `domain` here for `dom`
[policy_definition]
p = sub, obj, act, domain
e.SetFieldIndex("p", constant.DomainIndex, 3) // index starts from 0
users := e.GetAllUsersByDomain("domain1") // without SetFieldIndex, it will raise an error