RBAC with Domains
Định nghĩa Vai trò với Miền/Người thuê
Các vai trò RBAC trong Casbin có thể là toàn cục hoặc dành riêng cho miền. Các vai trò dành riêng cho miền có nghĩa là vai trò cho một người dùng có thể khác nhau khi người dùng đó ở trong các miền/người thuê khác nhau. Điều này rất hữu ích cho các hệ thống lớn như một đám mây, vì người dùng thường ở trong các người thuê khác nhau.
Định nghĩa vai trò với các miền/người thuê nên trông như thế này:
[role_definition]
g = _, _, _
Ký tự _
thứ ba đại diện cho tên của miền/người thuê, và phần này không nên thay đổi. Sau đó, chính sách có thể là:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
Điều này có nghĩa là vai trò admin
trong tenant1
có thể đọc data1
. Và alice
có vai trò admin
trong tenant1
và vai trò user
trong tenant2
. Do đó, cô ấy có thể đọc data1
. Tuy nhiên, vì alice
không phải là admin
trong tenant2
, cô ấy không thể đọc data2
.
Sau đó, trong một bộ so khớp, bạn nên kiểm tra vai trò như sau:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Vui lòng tham khảo rbac_with_domains_model.conf để tìm ví dụ.
Lưu ý: Theo quy ước, tên token miền trong định nghĩa chính sách là dom
và được đặt làm token thứ hai (sub, dom, obj, act
).
Bây giờ, Golang Casbin hỗ trợ tên token tùy chỉnh và vị trí đặt. Nếu tên token miền là dom
, token miền có thể được đặt ở vị trí tùy ý mà không cần hành động bổ sung. Nếu tên token miền không phải là dom
, e.SetFieldIndex()
cho constant.DomainIndex
nên được gọi sau khi enforcer được khởi tạo, bất kể vị trí của nó.
# `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