تخطَّ إلى المحتوى
العودة إلى المدونة

هندسة البرمجيات

وقت القراءة
14 دقيقة قراءة
تاريخ النشر
١٧ تموز ٢٠٢٦

مقال من برمج تك

اختبار عزل المستأجرين في تطبيقات Laravel SaaS

هندسة برمج تكالفريق الهندسيآخر مراجعة للمحتوى: ٢٠ تموز ٢٠٢٦
اختبار عزل المستأجرين في تطبيقات Laravel SaaS

يتناول هذا المقال «اختبار عزل المستأجرين في تطبيقات Laravel SaaS» ضمن محور «اختبارات عزل المستأجر في Laravel SaaS»، بلغة تشغيلية يمكن لفريق العمل تطبيقها مباشرة.

اختبار عزل المستأجرين في تطبيق Laravel يقدم البرمجيات كخدمة (SaaS) يثبت أن مستخدم شركة لا يستطيع قراءة أو تعديل أو استنتاج بيانات شركة أخرى، حتى عند تخمين المعرفات أو تشغيل مهمة مؤجلة أو تنزيل ملف أو استخدام لوحة إدارة. وجود tenant_id في الجداول أو نطاق عام تلقائي (Global Scope) لا يكفي؛ يجب اختبار كل موضع يدخل منه سياق المستأجر وكل موضع قد يفقده.

هذه المقالة تفترض تطبيقاً متعدد المستأجرين وتدخل في استراتيجية الاختبار. لا تدعي أن حزمة أو نمطاً واحداً يحقق العزل تلقائياً. بنية قاعدة منفصلة أو مخطط أو عمود مشترك تغير المخاطر، لكن التفويض والسجلات والملفات والطوابير والتكاملات تظل بحاجة إلى أدلة.

اكتب ثوابت العزل

ابدأ بجمل لا يجوز كسرها: كل سجل أعمال يملك مستأجراً؛ المستخدم يعمل ضمن عضوية فعالة؛ المعرف الخارجي لا يتجاوز السياسة؛ المهمة المؤجلة تستعيد المستأجر المقصود؛ الملف لا يُقرأ إلا بتفويض؛ الإدارة العابرة للمستأجرين صريحة ومدققة. هذه الثوابت تتحول إلى اختبارات مشتركة.

حدد الموارد العامة فعلاً، مثل خطط عامة أو قائمة بلدان، وافصلها عن بيانات المستأجر. الغموض يدفع المطور إلى إزالة قيد حتى «تعمل الصفحة». أي مسار عابر يحتاج سبباً ودوراً وضوابط مختلفة.

أنشئ بيانات اختبار تكشف أخطاء العزل

في كل اختبار، أنشئ مستأجرين على الأقل ومستخدمين وموارد متشابهة لكل منهما. استخدم معرفات متجاورة وأسماء متطابقة أحياناً حتى لا ينجح الاختبار مصادفة بسبب البحث بالاسم. لا تعتمد على بيانات قاعدة محلية قد تحمل مستأجراً واحداً.

أنشئ عضوية معلقة أو منتهية ومستخدماً ينتمي إلى مستأجرين بأدوار مختلفة. اختبر تبديل السياق لا مجرد تسجيل الدخول. يجب أن تكون أدوات المصنع سهلة حتى يضيف الفريق سيناريو عزل لكل ميزة جديدة.

اختبر طلبات HTTP خارج الحالة المثالية

جرّب العرض والتعديل والحذف والتنزيل وإجراءات المجموعة باستخدام معرف مورد من مستأجر آخر. تحقق من النتيجة المناسبة، سواء 404 لتقليل الكشف أو 403 وفق السياسة، ومن عدم تغير قاعدة البيانات. لا تكتفِ بأن الصفحة لا تعرض الرابط.

اختبر Route Model Binding، والمعرفات العامة، والفلاتر، والبحث، والتصدير، والفرز، والعلاقات المتداخلة. مسار مثل /projects/{project}/tasks/{task} يجب أن يثبت أن المهمة تنتمي إلى المشروع والمستأجر، لا أن كلا المعرفين موجودان فقط.

لا تعتمد على Global Scope وحده

النطاق العام يقلل الأخطاء في الاستعلامات العادية، لكنه قد يُزال بـwithoutGlobalScopes أو يتجاوز في استعلام خام أو علاقة غير مضبوطة. اختبر السياسات وطبقة تحديد المستأجر والقيود في قاعدة البيانات حيث تناسب. اجعل تجاوز النطاق محصوراً في خدمة ذات اسم وتحكم.

اكتب اختباراً يفشل إذا شُغل النموذج بلا سياق مستأجر في طلب عادي. السلوك الآمن غالباً أن يرفض أو يعيد صفراً، لا أن يعرض كل شيء. وثق الاستثناءات للكونسول والإدارة والمهام.

اختبر الإنشاء والتعيين الجماعي

لا تسمح للعميل بإرسال tenant_id موثوق. يجب أن يأتي من السياق المصرح به. أرسل معرف مستأجر آخر في الحمولة وتحقق من تجاهله أو رفضه. افعل ذلك للإنشاء والتحديث والاستيراد والنسخ.

اختبر العلاقات: إنشاء فاتورة لعميل من مستأجر آخر، أو إرفاق مستخدم بمشروع لا ينتمي إليه. تحقق في Form Request والخدمة والسياسة، ثم أضف قيوداً مركبة أو مفاتيح مناسبة عندما يمكن لقاعدة البيانات منع العلاقة المتقاطعة.

اختبر الاستعلامات المجمعة والتقارير

العدادات وsum وexists والرسوم والتقارير قد تسرب وجود بيانات حتى من دون عرض الصف. أنشئ قيماً مختلفة للمستأجرين وتحقق من الإجمالي بدقة. اختبر cache key لأن نتيجة مستأجر قد تُعاد لآخر إذا كان المفتاح عاماً.

راجع البحث الكامل ومحركات التحليل والنسخ المادية. يجب أن تحمل الوثيقة المستأجر وأن يطبق المرشح في الخادم، لا أن يعتمد على واجهة المستخدم. اختبر إعادة الفهرسة والحذف وتغيير العضوية.

اختبر الوظائف والطوابير

المهمة يجب أن تحمل معرف المستأجر والفاعل أو سبب النظام، ثم تستعيد السياق وتتحقق من صلاحيته عند التنفيذ. لا تسلسل نموذجاً وتفترض أن النطاق سيبقى. اختبر تنفيذ مهمة لمستأجرين بالتتابع في العامل نفسه حتى لا يتسرب سياق سابق.

غطِّ إعادة المحاولة والفشل والتسلسل والدفعات والمهام المجدولة. تحقق من أن failed_jobs والسجلات لا تكشف حمولة حساسة لمشغل غير مخول. يشرح دليل الويب هوك الموثوق كيف يجب أن يحتفظ الحدث أيضاً بحساب المستأجر عند المعالجة المؤجلة.

اختبر الملفات والتخزين

ضع مساراً أو بادئة لكل مستأجر، لكن لا تعتمد على الاسم وحده. تنزيل الملف يمر بسياسة وتوقيع قصير العمر عند الحاجة. حاول الوصول إلى مفتاح مستأجر آخر، وتغيير المعرف، وإعادة استخدام رابط بعد انتهاء الصلاحية.

اختبر الصور المصغرة والمعالجة الخلفية والتصدير والنسخ المؤقتة. قد يكون الملف الأصلي معزولاً بينما تُكتب النسخة المولدة في مسار عام. لا تستخدم bucket عاماً لبيانات خاصة ثم تراهن على صعوبة الرابط.

اختبر البث والإشعارات

قنوات WebSocket أو البث تحتاج تفويضاً يربط اسم القناة بالعضوية الحالية. حاول الاشتراك في قناة مستأجر آخر. تحقق من أن payload لا يحمل حقولاً لا يحتاجها المستلم. لا تجعل اسم القناة وحده سراً.

الإشعار والبريد والتصدير المجدول يجب أن يختار المستلم واللغة والروابط داخل سياق المستأجر. اختبر مستخدماً بعضوية في شركتين، وإلغاء عضويته قبل إرسال المهمة. لا ترسل رابطاً صالحاً بعد فقد الصلاحية.

اختبر Webhooks والتكاملات الواردة

اربط مفتاح التوقيع أو الحساب الخارجي بالمستأجر من إعداد خادمي، لا من tenant_id داخل payload. تحقق من التوقيع ثم حدد المستأجر ثم عالج الحدث idempotently. أرسل حدثاً صالح التوقيع لحساب آخر وتحقق من عدم ربطه بالمستأجر الخطأ.

في التكاملات الصادرة، تحقق من أن عنوان callback والاعتماد والسجل تخص المستأجر. اختبر retry بعد تغيير إعداد أو حذف مستأجر. لا تسمح لمستخدم عادي بإدخال عنوان داخلي يخلق طلبات غير آمنة.

اختبر لوحة الإدارة والدعم

الدعم العابر للمستأجرين أخطر مسار لأنه يتجاوز الحدود عمداً. استخدم دوراً منفصلاً وموافقة أو سبباً وسجل تدقيق، ولا تمنح ذلك لكل مدير مستأجر. اختبر أن impersonation ظاهر ومحدود وينتهي بوضوح.

تأكد من أن البحث الإداري لا يظهر بيانات حساسة أكثر من الحاجة وأن التصدير مراقب. اختبر سحب الدور فوراً. لا تستخدم حساباً عاماً مشتركاً للدعم.

أضف اختبارات بنيوية

يمكن لاختبار معماري فحص أن نماذج الأعمال تطبق عقد المستأجر، وأن migrations تضيف المفاتيح والفهارس، وأن الخدمات الخطرة لا تستخدم استعلامات غير مقيدة. هذه الشبكة لا تثبت السلوك وحدها لكنها تمنع نسيان طبقة كاملة.

استخدم تحليل ساكن ومراجعة للبحث عن withoutGlobalScopes وDB::table وcache keys والملفات العامة، ثم اطلب اختباراً يثبت كل استثناء. راجع شرح الفوترة متعددة المستأجرين لأن الخطط والاستحقاقات تحمل حدوداً إضافية.

شغّل الاختبارات في CI وبقاعدة قريبة

بعض قيود المفاتيح وJSON والأقفال تختلف بين SQLite وقاعدة الإنتاج. استخدم قاعدة مماثلة للمسارات الحرجة وشغّل الاختبارات بالتوازي إذا كان التطبيق يفعل ذلك. احذف الحالة بين الاختبارات من دون إخفاء مشاكل المعاملات.

أضف اختبار انحدار لكل حادث أو اكتشاف. لا تسجل بيانات حساسة في فشل CI. تقدم خدمة تطوير SaaS ملكية تجارية لهذا النوع من الحدود، لكن على كل فريق الاحتفاظ بمجموعة اختبارات عزل قابلة للتشغيل.

الخلاصة: حاول العبور من كل طبقة

دليل العزل ليس لقطة لصفحة؛ هو مجموعة محاولات عدائية عبر HTTP والسياسات والاستعلامات والطوابير والملفات والبث والتكاملات والإدارة. ابدأ بمستأجرين وموردين متشابهين واختبار ينكسر عند إزالة القيد. اطلب مراجعة اختبارات عزل Laravel SaaS مع مخطط المستأجر ومسارين حساسين من دون مشاركة أسرار أو بيانات عملاء.

أسئلة شائعة

لا. يمكن تجاوز النطاق أو نسيانه في استعلام أو مهمة؛ لذلك استخدم طبقات تفويض وقيوداً واختبارات لكل موضع عبور.

المصادر

#Laravel #SaaS

سياسة التحرير في برمج تك

اقرأ أيضاً

مقالات ذات صلة

  1. 01

    هندسة البرمجيات / 14 دقيقة قراءة

    بناء استقبال Webhooks موثوق: التوقيع ومنع التكرار

    بناء استقبال Webhooks موثوق: التوقيع
    غلاف: بناء استقبال Webhooks موثوق: التوقيع
  2. 02

    هندسة البرمجيات / 14 دقيقة قراءة

    حل تعارضات المزامنة دون اتصال من دون فقد البيانات

    حل تعارضات المزامنة دون اتصال
    غلاف: حل تعارضات المزامنة دون اتصال
  3. 03

    هندسة البرمجيات / 12 دقيقة قراءة

    Webhooks أم الاستعلام الدوري؟ تصميم تكامل موثوق

    Webhooks أم الاستعلام الدوري؟ تصميم

هل تبني نظاماً خاصاً لعملك؟

بعد قراءة «اختبار عزل المستأجرين في»، أرسل لنا وصفاً للمشروع والمستخدمين والتكاملات المطلوبة، وسنرد بخطوة عملية خلال يوم عمل.