نماذج الـ Authorization
عرفنا المستخدم مين. السؤال دلوقتي: مسموحله بإيه؟ الدرس ده بيبدأ بالمبادئ الأربعة اللي كل قرار صلاحية مبني عليها، وبعدين بيمشي معاك في 4 نماذج: قوايم، ووظايف، وخصايص، وعلاقات.
- تطبّق Deny by Default و Least Privilege و Complete Mediation و Server-side Only
- تفرّق بين ACL و RBAC و ABAC و ReBAC وتعرف كل واحد بيحل أنهي مشكلة
- تعرف مشكلة Role Explosion، وإمتى تنقل من RBAC لـ ABAC
- تعرف ليه الملكية (Ownership) هي أهم قاعدة هتكتبها في shop-lab
1. المبادئ الأربعة
كل قرار Authorization فيه 3 حاجات: مين (المستخدم)، وإيه (العملية: يشوف، يعدّل، يمسح)، وعلى إيه (المنتج 55، الأوردر 1043). وقبل ما نتكلم عن أي طريقة، فيه 4 مبادئ كل الطرق مبنية عليهم:
| المبدأ | معناه | في shop-lab |
|---|---|---|
| Deny by Default | أي حاجة مش مسموحة صراحة تبقى ممنوعة | route جديد في /admin نسيت تحميه؟ المفروض يتقفل لوحده عشان الـ group كله عليه middleware |
| Least Privilege | ادّي كل حد أقل صلاحية تكفيه | موظف خدمة العملاء يشوف الأوردرات، بس ميغيّرش الأسعار |
| Complete Mediation | اتشيك في كل request، مش أول مرة بس | الأدمن اللي اتشالت صلاحيته متفضلش الـ session بتاعته شغالة بصلاحية قديمة |
| Server-side Only | التشيك على السيرفر، مش في الـ UI | إنك تخبي زرار “مسح” عن العميل مش حماية. أي حد يقدر يبعت الـ request بنفسه |
امنع أي حاجة مش مسموحة، وادّي أقل صلاحية ممكنة، واتشيك في كل request، وعلى السيرفر بس.
2. ACL و RBAC
ACL (Access Control List)
زي ملف Google Docs: لما تدوس “مشاركة”، بتشوف قايمة “فلان يقدر يعدّل، وفلان يقدر يقرا بس”. القايمة متعلقة بالملف نفسه.
مشكلتها: لو عندك 10,000 منتج و 20 موظف، هتدير 200,000 سطر. ولو موظف جديد اشتغل، هتضيفه في 10,000 قايمة.
RBAC (Role-Based Access Control)
زي الشركة بالظبط. محدش بيقول “أحمد يقدر يفتح الخزنة”. بيقولوا “المحاسب يقدر يفتح الخزنة”، وأحمد محاسب. ولو أحمد ساب الشغل، بتشيل منه الدور، وخلاص.
اختار مستخدم، وبعدين صلاحية، واتفرج على المسار وهو بينور. وبعدين خلّي منى تسيب الشغل:
بتستخدمه فين في المتجر:
- admin: كل حاجة.
- support: يشوف الأوردرات ويعمل refund، بس ميلمسش المنتجات.
- customer: سلته وأوردراته بس.
ACL قايمة على كل حاجة، و RBAC وظايف بتشيل الصلاحيات، و RBAC بيكفي لحد ما القرار يحتاج تفاصيل.
3. ABAC و ReBAC
ABAC (Attribute-Based Access Control)
بدل “موظف support يعمل refund”، تقول قاعدة: “موظف support يعمل refund لو المبلغ أقل من 5,000 جنيه، والأوردر من نفس فرعه، وفي مواعيد الشغل”. حرّك الخصايص وشوف كل شرط بيتقيّم:
allow refund if role == support AND amount < 5000 AND order.branch == user.branch AND 9 ≤ hour < 18- الدور support (أو admin)
- المبلغ أقل من 5,000 (أو admin)
- من نفس الفرع
- في مواعيد الشغل (9 لـ 6)
| نوع الخاصية | أمثلة |
|---|---|
| المستخدم | الدور، الفرع، الأقدمية |
| الحاجة (Resource) | مبلغ الأوردر، صاحبه، حالته (مدفوع؟ اتشحن؟) |
| العملية | refund، cancel، view |
| الظروف | الساعة كام، الـ IP، هل عامل MFA |
وأبسط ABAC ممكن وأهمه هو الملكية (Ownership): “العميل يشوف الأوردر لو order.user_id == user.id”. دي هتكتبها في shop-lab أكتر من أي قاعدة تانية.
ReBAC (Relationship-Based Access Control)
زي GitHub: إنت تقدر تعدّل الـ repo لأنك عضو في team، والـ team ليه صلاحية write على الـ repo، والـ repo تبع الـ organization. القرار ماشي على سلسلة علاقات.
Google نشرت سنة 2019 ورقة عن نظام اسمه Zanzibar بيدير الصلاحيات دي لـ Drive و YouTube و Calendar، وبيرد على ملايين الأسئلة في الثانية. ومن ساعتها ظهرت أدوات مفتوحة المصدر مبنية على نفس الفكرة زي OpenFGA و SpiceDB.
المقارنة
| النموذج | بيسأل | كويس لـ | مثال |
|---|---|---|---|
| ACL | اسمك في القايمة؟ | مشاركة ملفات | Google Docs |
| RBAC | دورك إيه؟ | أغلب التطبيقات | لوحة أدمن shop-lab |
| ABAC | الخصايص بتسمح؟ | قواعد فيها شروط | refund أقل من 5,000 |
| ReBAC | علاقتك بالحاجة إيه؟ | منظمات وفرق ومشاركة متداخلة | GitHub، Google Drive |
في الحقيقة معظم الأنظمة بتخلط: RBAC للصورة الكبيرة، وقواعد ABAC (زي الملكية) فوقيه.
ابدأ بـ RBAC وقواعد ملكية بسيطة. وروح لـ ABAC لما القرار يحتاج شروط، ولـ ReBAC لما يحتاج سلسلة علاقات.
أسئلة الإنترفيو
فكّر في إجابتك الأول، وبعدين افتح السؤال.
01الفرق بين RBAC و ABAC؟
RBAC بيدّي الصلاحيات للأدوار والأدوار للمستخدمين، وده بسيط وكويس لأغلب التطبيقات. ABAC بيقرر بخصايص المستخدم والحاجة والعملية والظروف، زي "refund لو المبلغ أقل من 5000 ومن نفس الفرع". ولما RBAC يبدأ يحتاج أدوار لكل حالة (role explosion)، يبقى وقت ABAC. وغالباً الاتنين بيتخلطوا.
02إخفاء الزرار في الـ UI حماية؟
لأ. ده UX بس. أي حد يقدر يبعت الـ request بنفسه من Postman. الحماية الحقيقية لازم تبقى على السيرفر في كل request.
03اشرح Deny by Default و Least Privilege.
Deny by Default: أي حاجة مش مسموحة صراحة تبقى ممنوعة، فلو نسيت تحمي route يتقفل لوحده. Least Privilege: كل حد ياخد أقل صلاحية تكفيه، فلو حسابه اتسرق الضرر يبقى محدود.
04إيه هو ReBAC، وفين بتشوفه؟
صلاحيات مبنية على علاقات، حتى لو غير مباشرة: إنت في team، والـ team ليه write على repo، والـ repo في organization. زي GitHub و Google Drive. و Google عملت نظام Zanzibar للحكاية دي.