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

RBAC

تعريف الدور

يُستخدم [role_definition] لتعريف علاقات الإرث في أدوار RBAC. يدعم Casbin عدة نماذج من أنظمة RBAC، حيث يمكن للمستخدمين أن يكون لهم أدوار وعلاقات إرث، ويمكن أيضًا للموارد أن يكون لها أدوار وعلاقات إرث. هذين النظامين RBAC لن يتداخلا مع بعضهما البعض.

هذا القسم اختياري. إذا لم تستخدم أدوار RBAC في النموذج، فتجاهل هذا القسم.

[role_definition]
g = _, _
g2 = _, _

يُظهر تعريف الدور أعلاه أن g هو نظام RBAC، وg2 هو نظام RBAC آخر. _,_ يعني أن هناك طرفين متورطين في علاقة إرث. في الحالة الأكثر شيوعًا، عادةً ما تستخدم g وحده إذا كنت تحتاج فقط إلى أدوار للمستخدمين. يمكنك أيضًا استخدام كل من g وg2 عندما تحتاج إلى أدوار (أو مجموعات) لكل من المستخدمين والموارد. يرجى الاطلاع على rbac_model.conf وrbac_model_with_resource_roles.conf للأمثلة.

يخزن Casbin تعيين المستخدم-الدور الفعلي (أو تعيين المورد-الدور إذا كنت تستخدم أدوارًا على الموارد) في السياسة. على سبيل المثال:

p, data2_admin, data2, read
g, alice, data2_admin

هذا يعني أن alice ترث/هي عضو في دور data2_admin. هنا، يمكن أن تكون alice مستخدمًا، أو موردًا، أو دورًا. يعترف Casbin بها فقط كسلسلة نصية.

ثم، في مطابق، يجب التحقق من الدور كما هو موضح أدناه:

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

هذا يعني أن sub في الطلب يجب أن يكون له الدور sub في السياسة.

ملاحظة
  1. يخزن Casbin فقط تعيين المستخدم-الدور.
  2. لا يتحقق Casbin مما إذا كان المستخدم مستخدمًا صالحًا أو الدور دورًا صالحًا. يجب أن يتم الاعتناء بذلك من خلال المصادقة.
  3. لا تستخدم نفس الاسم لمستخدم ودور داخل نظام RBAC، لأن Casbin يعترف بالمستخدمين والأدوار كسلاسل نصية، ولا يوجد طريقة لـ Casbin لمعرفة ما إذا كنت تحدد المستخدم alice أو الدور alice. يمكنك حل ذلك ببساطة باستخدام role_alice.
  4. إذا كان لدى A دور B، وكان لدى B دور C، فإن A لديه دور C. هذه العلاقة الانتقالية لا نهائية حتى الآن.
اتفاقية اسم الرمز المميز

تقليديًا، يُسمى رمز الموضوع في تعريف السياسة sub ويوضع في البداية. الآن، يدعم Casbin بلغة Golang أسماء رموز مخصصة وأماكن مختلفة. إذا كان اسم رمز الموضوع هو sub، فيمكن وضع رمز الموضوع في مكان عشوائي دون الحاجة إلى أي إجراء إضافي. إذا لم يكن اسم رمز الموضوع هو sub، يجب استدعاء e.SetFieldIndex() لـ constant.SubjectIndex بعد تهيئة المنفذ، بغض النظر عن موقعه.

# `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

هرمية الدور

يدعم RBAC في Casbin ميزة هرمية الدور في RBAC1، وهذا يعني أنه إذا كان لدى alice دور role1، وكان لدى role1 دور role2، فإن alice ستمتلك أيضًا دور role2 وترث صلاحياته.

هنا، لدينا مفهوم يسمى مستوى الهرمية. لذا، في هذا المثال، مستوى الهرمية هو 2. بالنسبة لمدير الدور المدمج في Casbin، يمكنك تحديد الحد الأقصى لمستوى الهرمية. القيمة الافتراضية هي 10. هذا يعني أن مستخدم نهائي مثل alice يمكنه فقط أن يرث 10 مستويات من الأدوار.

// 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
}

كيف تميز بين الدور والمستخدم؟

لا يميز Casbin بين الأدوار والمستخدمين في RBAC الخاص به. كلاهما يعامل كسلاسل نصية. إذا كنت تستخدم فقط RBAC ذو مستوى واحد (حيث لن يكون الدور عضوًا في دور آخر)، يمكنك استخدام e.GetAllSubjects() للحصول على جميع المستخدمين وe.GetAllRoles() للحصول على جميع الأدوار. سيتم سرد جميع u وجميع r على التوالي في جميع قواعد g, u, r.

ولكن إذا كنت تستخدم RBAC متعدد المستويات (مع هرمية الدور) ولا يسجل تطبيقك ما إذا كان الاسم (السلسلة النصية) هو مستخدم أو دور، أو لديك مستخدم ودور بنفس الاسم، يمكنك إضافة بادئة إلى الدور مثل role::admin قبل تمريره إلى Casbin. هكذا، ستعرف إذا كان دورًا بفحص هذه البادئة.

كيف تستعلم عن الأدوار أو الصلاحيات الضمنية؟

عندما يرث المستخدم دورًا أو صلاحية عبر هرمية RBAC بدلاً من تعيينها له مباشرةً في قاعدة سياسة، نسمي هذا النوع من التعيين "ضمني". للاستعلام عن مثل هذه العلاقات الضمنية، تحتاج إلى استخدام هاتين الواجهتين البرمجيتين: GetImplicitRolesForUser() وGetImplicitPermissionsForUser() بدلاً من GetRolesForUser() وGetPermissionsForUser(). لمزيد من التفاصيل، يرجى الاطلاع على هذه المشكلة على GitHub.

استخدام مطابقة الأنماط في RBAC

راجع RBAC مع النمط

مدير الأدوار

راجع قسم مدراء الأدوار للتفاصيل.