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

ABAC

ما هو نموذج ABAC؟

يرمز ABAC إلى Attribute-Based Access Control. يتيح لك التحكم في الوصول باستخدام السمات (الخصائص) للموضوع، الكائن، أو العمل بدلاً من استخدام القيم النصية نفسها. قد سمعت عن لغة تحكم في الوصول ABAC المعقدة تسمى XACML. من ناحية أخرى، ABAC في Casbin أبسط بكثير. في ABAC في Casbin، يمكنك استخدام الهياكل أو مثيلات الفئة بدلاً من السلاسل لعناصر النموذج.

دعونا نلقي نظرة على مثال ABAC الرسمي:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == r.obj.Owner

في المواطن، نستخدم r.obj.Owner بدلاً من r.obj. الـ r.obj الذي يُمرر في دالة Enforce() سيكون مثيل لهيكل أو فئة بدلاً من سلسلة نصية. سيستخدم Casbin التأمل لاسترداد متغير العضو obj في ذلك الهيكل أو الفئة لك.

إليك تعريف لهيكل r.obj أو فئة:

type testResource struct {
Name string
Owner string
}

إذا كنت تريد تمرير معاملات إلى المفروض من خلال JSON، فأنت بحاجة إلى تفعيل الوظيفة باستخدام e.EnableAcceptJsonRequest(true).

على سبيل المثال:

e, _ := NewEnforcer("examples/abac_model.conf")
e.EnableAcceptJsonRequest(true)

data1Json := `{ "Name": "data1", "Owner": "bob"}`

ok, _ := e.Enforce("alice", data1Json, "read")
ملاحظة

تفعيل وظيفة قبول معاملات JSON قد يؤدي إلى انخفاض في الأداء بنسبة 1.1 إلى 1.5 مرة.

كيفية استخدام ABAC؟

لاستخدام ABAC، تحتاج إلى القيام بشيئين:

  1. تحديد السمات في مطابق نموذج الموديل.
  2. تمرير مثيل الهيكل أو الفئة للعنصر كوسيطة إلى دالة Enforce() في Casbin.
خطر

حاليًا، فقط عناصر الطلب مثل r.sub، r.obj، r.act، وما إلى ذلك تدعم ABAC. لا يمكنك استخدامها على عناصر السياسة مثل p.sub لأنه لا توجد طريقة لتعريف بنية أو فئة في سياسات Casbin.

نصيحة

يمكنك استخدام عدة سمات ABAC في الموازن. على سبيل المثال: m = r.sub.Domain == r.obj.Domain.

نصيحة

إذا كنت بحاجة إلى استخدام فاصلة في سياسة تتعارض مع فاصل CSV، يمكنك إسكافيها بتغليف العبارة بعلامات اقتباس. على سبيل المثال، "keyMatch("bob", r.sub.Role)" لن يتم تقسيمه.

توسيع نطاق النموذج للقواعد الكبيرة والمعقدة من ABAC

التنفيذ أعلاه لنموذج ABAC بسيط في جوهره. ومع ذلك، في العديد من الحالات، يتطلب نظام التفويض قواعد ABAC كبيرة ومعقدة. لتلبية هذا المطلب، يوصى بإضافة القواعد في السياسة بدلاً من النموذج. يمكن القيام بذلك عن طريق تقديم منشئ وظيفي eval(). إليك مثالاً:

هذا هو تعريف ملف CONF المستخدم لتعريف نموذج ABAC.

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub_rule, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = eval(p.sub_rule) && r.obj == p.obj && r.act == p.act

في هذا المثال، p.sub_rule هي بنية أو فئة (نوع معرف من قبل المستخدم) تحتوي على السمات الضرورية لاستخدامها في السياسة.

هذه هي السياسة التي تستخدم ضد النموذج لـ التطبيق. الآن، يمكنك استخدام مثيل الكائن الذي تم تمريره إلى eval() كمعامل لتحديد قيود ABAC معينة.

p, r.sub.Age > 18, /data1, read
p, r.sub.Age < 60, /data2, write