التخطي إلى المحتوى الرئيسي

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