فهم قواعد أمان قاعدة بيانات Firebase في الوقت الفعلي

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

تتضمّن "قواعد الأمان" في Realtime Database بنية مشابهة لبنية JavaScript، وتتوفّر بأربعة أنواع:

أنواع القواعد
.read توضّح هذه السمة ما إذا كان يُسمح للمستخدمين بقراءة البيانات ومتى يُسمح لهم بذلك.
.write توضّح هذه السمة ما إذا كان مسموحًا بكتابة البيانات ومتى.
.validate تحدّد هذه السمة شكل القيمة المنسّقة بشكل صحيح، وما إذا كانت تتضمّن سمات فرعية، ونوع البيانات.
.indexOn تحدّد هذه السمة عنصرًا فرعيًا للفهرسة من أجل إتاحة ترتيب النتائج وتنفيذ طلبات البحث.

Realtime Database نظرة عامة على الأمان

توفر Firebase Realtime Database مجموعة كاملة من الأدوات لإدارة أمان تطبيقك، وتسهّل هذه الأدوات عملية مصادقة المستخدمين وفرض أذونات المستخدمين والتحقّق من صحة المدخلات.

تنفِّذ التطبيقات المستندة إلى Firebase عددًا أكبر من الرموز البرمجية من جهة العميل مقارنةً بالتطبيقات التي تستخدم العديد من حِزم التكنولوجيا الأخرى. لذلك، قد يختلف أسلوبنا في التعامل مع الأمان عن الأسلوب الذي اعتدت عليه.

المصادقة

تتمثّل الخطوة الأولى الشائعة في تأمين تطبيقك في تحديد هوية المستخدمين. تُعرف هذه العملية باسم المصادقة. يمكنك استخدام خدمة Firebase Authentication لإتاحة تسجيل الدخول إلى تطبيقك. تتضمّن خدمة Firebase Authentication إمكانية استخدام طرق المصادقة الشائعة، مثل Google وFacebook، بالإضافة إلى تسجيل الدخول باستخدام البريد الإلكتروني وكلمة المرور، وتسجيل الدخول بدون تحديد الهوية، وغير ذلك.

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

التفويض

تحديد هوية المستخدم هو جزء واحد فقط من الأمان. بعد معرفة هؤلاء المستخدمين، تحتاج إلى طريقة للتحكّم في إذن وصولهم إلى البيانات في قاعدة البيانات. تتيح لك "قواعد الأمان" في Realtime Database التحكّم في إذن الوصول لكل مستخدم. على سبيل المثال، إليك مجموعة من قواعد الأمان التي تسمح لأي شخص بقراءة المسار /foo/، ولكن لا تسمح لأي شخص بالكتابة إليه:

{
  "rules": {
    "foo": {
      ".read": true,
      ".write": false
    }
  }
}

تتتالى قواعد .read و.write، لذا تمنح مجموعة القواعد هذه إذن القراءة لأي بيانات في المسار /foo/ بالإضافة إلى أي مسارات أعمق مثل /foo/bar/baz. يُرجى العِلم أنّ قواعد .read و.write الأقل عمقًا في قاعدة البيانات تتجاوز القواعد الأكثر عمقًا، لذا سيظلّ إذن الوصول للقراءة إلى /foo/bar/baz متاحًا في هذا المثال حتى إذا تم تقييم قاعدة في المسار /foo/bar/baz على أنّها خطأ.

تتضمّن قواعد الأمان في Realtime Database متغيرات مدمجة ودوال تتيح لك الإشارة إلى مسارات أخرى والطوابع الزمنية من جهة الخادم ومعلومات المصادقة وغير ذلك. في ما يلي مثال على قاعدة تمنح المستخدمين الذين تمّت مصادقتهم إذن الكتابة إلى /users/<uid>/، حيث <uid> هو معرّف المستخدم الذي تمّ الحصول عليه من خلال Firebase Authentication.

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

التحقّق من صحة البيانات

Firebase Realtime Database بدون مخطط. يسهّل ذلك إجراء تغييرات أثناء عملية التطوير، ولكن بعد أن يصبح تطبيقك جاهزًا للتوزيع، من المهم أن تظل البيانات متسقة. تتضمّن لغة القواعد قاعدة .validate تتيح لك تطبيق منطق التحقّق من الصحة باستخدام العبارات نفسها المستخدَمة لقواعد .read و.write. الاختلاف الوحيد هو أنّ قواعد التحقّق من الصحة لا تتتالى، لذا يجب أن يتم تقييم جميع قواعد التحقّق من الصحة ذات الصلة على أنّها صحيحة من أجل السماح بالكتابة.

تفرض هذه القاعدة أن تكون البيانات المكتوبة في /foo/ سلسلة أقل من 100 حرف:

{
  "rules": {
    "foo": {
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

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

تحديد فهارس قاعدة البيانات

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

يتم تحديد الفهارس باستخدام قاعدة .indexOn. في ما يلي مثال على تعريف فهرس يفهرس الحقلَين height وlength لقائمة ديناصورات:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

الخطوات التالية