RBAC with Domains
تعريف الدور مع مستأجري النطاق
أدوار RBAC في Casbin يمكن أن تكون عالمية أو خاصة بنطاق معين. الأدوار الخاصة بنطاق معين تعني أن الأدوار لمستخدم يمكن أن تختلف عندما يكون المستخدم في نطاقات/مستأجرين مختلفين. هذا مفيد جدًا للأنظمة الكبيرة مثل السحابة، حيث يكون المستخدمون عادة في مستأجرين مختلفين.
يجب أن يبدو تعريف الدور مع النطاقات/المستأجرين كما يلي:
[role_definition]
g = _, _, _
الشرطة الثالثة _
تمثل اسم النطاق/المستأجر، ولا يجب تغيير هذا الجزء. ثم يمكن أن تكون السياسة كما يلي:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
هذا يعني أن دور admin
في tenant1
يمكنه قراءة data1
. وalice
لديها دور admin
في tenant1
ودور user
في tenant2
. لذلك، يمكنها قراءة data1
. ومع ذلك، بما أن alice
ليست admin
في tenant2
، فإنها لا تستطيع قراءة data2
.
ثم، في مطابق، يجب التحقق من الدور كما يلي:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
يرجى الرجوع إلى rbac_with_domains_model.conf للأمثلة.
ملاحظة: تقليديًا، اسم رمز النطاق في تعريف السياسة هو dom
ويوضع كرمز ثاني (sub, dom, obj, act
).
الآن، يدعم Golang Casbin أسماء رموز مخصصة وتحديد مواقعها. إذا كان اسم رمز النطاق هو dom
، يمكن وضع رمز النطاق في موقع عشوائي دون أي إجراء إضافي. إذا لم يكن اسم رمز النطاق هو dom
، يجب استدعاء e.SetFieldIndex()
لـ constant.DomainIndex
بعد تهيئة المنفذ، بغض النظر عن موقعه.
# `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