تصميم الصلاحيات: لماذا تنهار الأدوار الثابتة عند العميل الخامس
من دور واحد إلى نموذج صلاحيات يحتمل النمو، دون أن يتحوّل كل طلب عميل إلى تعديل في الكود.
تبدأ كل منصة بدورين: مالك ومستخدم. ثم يطلب عميل «مساعداً يرى المبيعات ولا يعدّل الدورات»، وآخر «مصححاً يرى واجبات فصل واحد فقط». إن كانت الأدوار ثابتة في الكود، صار كل طلب إصداراً جديداً.
افصل الدور عن الصلاحية
الخطأ الشائع هو التحقّق من الدور مباشرة: `if (user.role === 'admin')`. هذا يربط كل نقطة في الكود بقائمة أدوار مغلقة. تحقّق من الصلاحية بدلاً منه: `can(user, 'course.publish')`. الأدوار تصبح مجرد حزم من الصلاحيات، ويمكن لعميل أن يصنع دوره دون أن تلمس سطراً.
الصلاحية ليست قراراً ثنائياً
- الفعل: ماذا يريد أن يفعل؟ (عرض، إنشاء، تعديل، حذف، نشر)
- المورد: على أي شيء؟ (دورة، متدرّب، فاتورة)
- النطاق: أي نسخة منه؟ (كل الدورات، دوراته هو، دورات فصل محدد)
أغلب الأنظمة تعالج الأول والثاني وتنسى الثالث، فتجد نفسك تكتب استثناءات في كل استعلام. اجعل النطاق جزءاً من نموذج الصلاحية منذ البداية حتى لو بدأت بنطاق واحد.
الحرمان يجب أن يكون الافتراض
أي صلاحية غير ممنوحة صراحةً هي ممنوعة. يبدو بديهياً حتى تضيف ميزة جديدة وتنسى ربطها بصلاحية — إن كان الافتراض هو السماح، فقد فتحتها للجميع دون أن تدري. اجعل غياب التعريف خطأً يظهر في التطوير لا صمتاً يظهر في الإنتاج.
الميزة الجديدة التي لا صلاحية لها يجب أن تفشل، لا أن تنجح للجميع.
التحقّق في الطبقة الصحيحة
إخفاء زر في الواجهة ليس صلاحية، بل تحسين تجربة. التحقّق الحقيقي يحدث في الخادم عند كل نقطة نهاية، وعلى مستوى الاستعلام حين يكون النطاق مرتبطاً بالبيانات. كرّر التحقّق في الواجهة لتحسين التجربة فقط، ولا تعتمد عليه أبداً.
قابلية التدقيق
حين ينمو الفريق يصبح السؤال «من غيّر هذا؟» يومياً. سجّل كل تغيير على الصلاحيات نفسها، وكل عملية حسّاسة، مع الفاعل والوقت والقيمة قبل وبعد. لن تحتاجه غالباً، وحين تحتاجه لن يكون له بديل.
النموذج الأصلي موصوف في مشروع NIST للتحكّم بالوصول المبني على الأدوار، وورقة Zanzibar من جوجل هي المرجع لمن يحتاج صلاحيات دقيقة على مستوى المورد بمقياس كبير. وللأخطاء الشائعة عملياً، دليل OWASP للتفويض قائمة مراجعة مختصرة.
وإن كنت تصمّم نموذج صلاحيات لمنتجك، فالوقت الأمثل لمراجعته هو قبل أول عميل مؤسسي. تحدّث إلينا.
أسئلة شائعة
متى أنتقل من RBAC إلى ABAC؟
حين تبدأ الصلاحية تعتمد على خصائص البيانات لا على هوية المستخدم فقط — مثل «يرى الطلبات التي تخصّ فرعه».
هل أسمح للعميل بإنشاء أدوار مخصصة؟
نعم إن كان جمهورك مؤسسات. ابدأ بأدوار جاهزة قابلة للنسخ والتعديل بدل صفحة فارغة.
أين أخزّن الصلاحيات؟
في قاعدة البيانات مع تخزين مؤقت قصير. تعريفها في الكود يجعل كل تغيير عميل إصداراً جديداً.