التفويض المتقدّم: السياسات و CASL
التفويض المتقدّم: السياسات و CASL
يُجيب RBAC عن "هل لهذا المستخدم دور المدير؟" لكنّ التطبيقات الحقيقية تحتاج قواعد أدقّ: "هل يستطيع هذا المستخدم تعديل هذا المقال تحديدًا؟" يعتمد ذلك على المستخدم والإجراء والمورد معًا. تعالج المصادقة القائمة على السياسات (أو السمات) هذا، وCASL أشهر مكتبة لها في عالم NestJS.
لماذا لا يكفي RBAC
تأمّل تعديل مقال. القاعدة "يستطيع المستخدم تعديل مقال ألّفه، أو أي مقال إن كان مديرًا". لا يستطيع RBAC الصرف التعبير عن نصف الملكية — فالقرار يعتمد على مقارنة المستخدم بالمورد. وهنا تتألّق السياسات.
تعريف القدرات بـ CASL
يصف CASL الصلاحيات كـ قدرات (abilities): تركيبات من إجراء (read أو update أو delete) وموضوع (نموذج)، اختياريًا بشروط:
manage وall رمزان شاملان في CASL يعنيان "أي إجراء" و"أي موضوع". والشرط { authorId: user.id } هو قاعدة الملكية التي لم يستطع RBAC التعبير عنها.
فحص قدرة
ability.can('update', article) الشرط مقابل نسخة المقال الفعلية — مقارنةً authorId بالمستخدم. تلك هي القفزة وراء فحوص الأدوار.
التكامل مع NestJS
النمط الاصطلاحي مزوّد CaslAbilityFactory يبني القدرات لمستخدم، إضافةً إلى حارس سياسات يُقيّم سياسة مُعلَنة. يُرفِق مُزخرِف @CheckPolicies() القاعدةَ، ويفرضها الحارس:
اختيار النموذج الصحيح
- RBAC — بوّابات أدوار بسيطة ("المديرون فقط"). استخدمه حين تتطابق الصلاحيات بنظافة مع الأدوار.
- السياسات/ABAC (CASL) — قواعد تتضمّن ملكية أو شروطًا أو سمات مورد. استخدمه حين "يعتمد الأمر على المورد".
الخلاصة
تُعبّر المصادقة القائمة على السياسات (بـ CASL) عن قواعد تعتمد على الإجراء والموضوع وشروط المورد — كتعديل محتواك فقط — وهو ما لا يستطيعه RBAC. عرّف القدرات بـ can/cannot، وافحصها بوعي بالمورد عبر ability.can(action, resource)، وادمجها عبر حارس سياسات و@CheckPolicies(). استخدم RBAC للأدوار الخشنة والسياسات لقواعد الملكية الدقيقة. بهذا تكتمل المرحلة السادسة — صارت واجهاتك مُصادَقة ومُفوَّضة كما ينبغي. تاليًا: تصميم API.