How It Works
في Casbin، يتم تجريد نموذج التحكم في الوصول إلى ملف CONF بناءً على نموذج PERM (السياسة، التأثير، الطلب، المطابقات). تحويل أو ترقية آلية التفويض لمشروع يكون بسيطًا مثل تعديل التكوين. يمكنك تخصيص نموذج التحكم في الوصول الخاص بك عن طريق دمج النماذج المتاحة. على سبيل المثال، يمكنك دمج أدوار RBAC وسمات ABAC معًا داخل نموذج واحد ومشاركة مجموعة واحدة من قواعد السياسة.
نموذج PERM يتكون من أربعة أسس: السياسة، التأثير، الطلب، والمطابقات. تصف هذه الأسس العلاقة بين الموارد والمستخدمين.
Request
يحدد معلمات الطلب. الطلب الأساسي هو كائن tuple، يتطلب على الأقل هدف (الكيان المطلوب الوصول إليه)، كائن (المورد المطلوب الوصول إليه)، وإجراء (طريقة الوصول).
على سبيل المثال، قد تبدو تعريف الطلب كالتالي:
هذا التعريف يحدد أسماء المعلمات وترتيبها المطلوب من قبل وظيفة مطابقة سيطرة الوصول.
Policy
يحدد نموذج استراتيجية الوصول. يحدد أسماء وترتيب الحقول في مستند قاعدة السياسة.
على سبيل المثال:
ملاحظة: إذا لم يتم تعريف eft (نتيجة السياسة)، فلن يتم قراءة حقل النتيجة في ملف السياسة، وسيتم السماح بنتيجة السياسة المطابقة بشكل افتراضي.
Matcher
تحدد قواعد المطابقة للطلب والسياسة.
على سبيل المثال: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj
سيتم حفظ نتيجة الاستراتيجية في p.eft
.
Effect
يقوم بتنفيذ عملية تحليل منطقي على نتائج مطابقة الموازنات.
على سبيل المثال: e = some(where(p.eft == allow))
هذه العبارة تعني أنه إذا كانت نتيجة الاستراتيجية المطابقة p.eft
لها نتيجة (بعض) السماح، فإن النتيجة النهائية تكون صحيحة.
دعونا ننظر إلى مثال آخر:
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
المعنى المنطقي لهذا المثال المركب هو: إذا كان هناك استراتيجية تطابق نتيجة السماح ولا توجد استراتيجية تطابق نتيجة الرفض، فإن النتيجة تكون صحيحة. بمعنى آخر، هذا صحيح عندما تكون جميع استراتيجيات المطابقة مسموح بها. إذا كان هناك أي نهائي، فكلاهما خاطئ (بشكل أبسط، عندما يكون كل من السماح والنهائي موجودًا في نفس الوقت، يتفوق النهائي).
أساسيًا وأبسط نموذج في Casbin هو ACL. ملف CONF لنموذج ACL هو كما يلي:
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
مثال على سياسة لنموذج ACL هو:
p, alice, data1, read
p, bob, data2, write
هذا يعني:
- يمكن لأليس قراءة data1
- يمكن لبوب كتابة data2
نحن ندعم أيضًا الوضع متعدد الأسطر عن طريق إضافة '' في النهاية:
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act
علاوة على ذلك، إذا كنت تستخدم ABAC، يمكنك تجربة مشغل 'in' كما هو موضح في المثال التالي لإصدار Casbin golang (لا يتم دعم jCasbin و Node-Casbin حتى الآن):
# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')
لكنك يجب أن تتأكد من أن طول المصفوفة أكبر من واحد، وإلا سيسبب ذلك حالة من الذعر.
لمزيد من العوامل، يمكنك إلقاء نظرة على govaluate.