Google is committed to advancing racial equity for Black communities. See how.
ترجمت واجهة Cloud Translation API‏ هذه الصفحة.
Switch to English

إدارة ونشر قواعد أمان Firebase

استخدم Firebase CLI

قم بتحرير القواعد ونشرها باستخدام Firebase CLI . يسمح لك استخدام CLI بإبقاء القواعد الخاصة بك تحت التحكم في الإصدار باستخدام كود التطبيق الخاص بك ونشر القواعد كجزء من عملية النشر الحالية.

قم بإنشاء ملف التكوين

عند تهيئة مشروع Firebase باستخدام Firebase CLI ، يمكنك إنشاء ملف تكوين .rules في دليل المشروع. استخدم الأمر التالي لبدء تكوين مشروع Firebase:

سحابة Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

قاعدة بيانات الوقت الحقيقي

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

تخزين

// Set up Storage in your project directory, creates a .rules file
firebase init storage

تحرير وتحديث القواعد الخاصة بك

تعديل القواعد الخاصة بك مباشرة في .rules ملف التكوين. تأكد من أن أي تعديلات تجريها في Firebase CLI تنعكس في وحدة تحكم Firebase ، أو أنك تجري تحديثات باستمرار باستخدام إما وحدة تحكم Firebase أو Firebase CLI. خلاف ذلك ، يمكنك الكتابة فوق أي تحديثات تم إجراؤها في وحدة تحكم Firebase.

اختبر تحديثاتك

استخدم محاكي Firebase لاختبار تحديثاتك محليًا والتأكد من أن قواعد تطبيقك تعرض السلوك الذي تريده.

انشر تحديثاتك

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

سحابة Firestore

0812 أبفاد

قاعدة بيانات الوقت الحقيقي

// Deploy your .rules file
firebase deploy --only database

تخزين

// Deploy your .rules file
firebase deploy --only storage

استخدم وحدة تحكم Firebase

يمكنك أيضًا تعديل القواعد ونشرها من وحدة تحكم Firebase.

تحرير وتحديث القواعد الخاصة بك

  1. افتح وحدة تحكم Firebase وحدد مشروعك.
  2. بعد ذلك ، حدد Realtime Database أو Cloud Firestore أو Storage من التنقل في المنتج ، ثم انقر على القواعد للانتقال إلى محرر القواعد.
  3. تحرير القواعد الخاصة بك مباشرة في المحرر.

اختبر تحديثاتك

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

انشر تحديثاتك

بمجرد اقتناعك بأن تحديثاتك هي ما تتوقعه ، انقر فوق نشر .

استخدم Admin SDK

يمكنك استخدام Admin SDK لـ Node.js لإنشاء قواعد الأمان وإدارتها ونشرها برمجيًا. باستخدام هذا الوصول الآلي ، يمكنك:

  • تنفيذ أدوات مخصصة ونصوص ولوحات معلومات وخطوط أنابيب CI / CD لإدارة القواعد.
  • إدارة القواعد بسهولة أكبر عبر مشاريع Firebase المتعددة.

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

شيء آخر مهم يجب أخذه في الاعتبار هو أن قواعد أمان Firebase تستغرق عدة دقائق لنشرها بالكامل. عند استخدام Admin SDK لنشر القواعد ، تأكد من تجنب ظروف السباق التي يعتمد فيها تطبيقك فورًا على القواعد التي لم يكتمل نشرها بعد. إذا كانت حالة الاستخدام الخاصة بك تتطلب تحديثات متكررة للوصول إلى قواعد التحكم ، ففكر في الحلول باستخدام Cloud Firestore ، المصمم لتقليل ظروف السباق على الرغم من التحديثات المتكررة.

لاحظ أيضًا هذه الحدود:

  • يجب أن تكون القواعد أصغر من 64 كيلوبايت من النص المشفر UTF-8 عند إجراء تسلسل.
  • يمكن أن يحتوي المشروع على 2500 مجموعة قواعد تم نشرها على الأكثر. بمجرد الوصول إلى هذا الحد ، يجب عليك حذف بعض مجموعات القواعد القديمة قبل إنشاء مجموعات جديدة.

قم بإنشاء ونشر مجموعات قواعد التخزين أو Cloud Firestore

يمكن أن يتضمن سير العمل النموذجي لإدارة قواعد الأمان باستخدام Admin SDK ثلاث خطوات منفصلة:

  1. إنشاء ملف قواعد (اختياري)
  2. أنشئ مجموعة قواعد
  3. حرر أو انشر مجموعة القواعد الجديدة

توفر SDK طريقة لدمج هذه الخطوات في استدعاء واحد لواجهة برمجة التطبيقات لقواعد أمان التخزين و Cloud Firestore. فمثلا:

    const source = `service cloud.firestore {
      match /databases/{database}/documents {
        match /carts/{cartID} {
          allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
          allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
        }
      }
    }`;
    // Alternatively, load rules from a file
    // const fs = require('fs');
    // const source = fs.readFileSync('path/to/firestore.rules', 'utf8');

    await admin.securityRules().releaseFirestoreRulesetFromSource(source);

يعمل هذا النمط نفسه مع قواعد التخزين مع releaseFirestoreRulesetFromSource() .

بدلاً من ذلك ، يمكنك إنشاء ملف القواعد ككائن في الذاكرة ، وإنشاء مجموعة القواعد ، ونشر مجموعة القواعد بشكل منفصل للتحكم عن كثب في هذه الأحداث. فمثلا:

    const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
    const rs = await admin.securityRules().createRuleset(rf);
    await admin.securityRules().releaseFirestoreRuleset(rs);

تحديث مجموعات قواعد قاعدة بيانات الوقت الفعلي

لتحديث مجموعات قواعد Realtime Database باستخدام Admin SDK ، استخدم getRules() و setRules() في admin.database . يمكنك استرداد مجموعات القواعد بتنسيق JSON ، أو كسلسلة بها تعليقات.

لتحديث مجموعة القواعد:

    const source = `{
      "rules": {
        "scores": {
          ".indexOn": "score"
            "$uid": {
            ".read": "$uid == auth.uid",
            ".write": "$uid == auth.uid"
          }
        }
      }
    }`;
    await admin.database().setRules(source);

إدارة القواعد

للمساعدة في إدارة مجموعات القواعد الكبيرة ، تتيح لك Admin SDK سرد جميع القواعد الحالية مع admin.securityRules().listRulesetMetadata . فمثلا:

    const allRulesets = [];
    let pageToken = null;
    while (true) {
      const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
      allRulesets.push(...result.rulesets);
      pageToken = result.nextPageToken;
      if (!pageToken) {
        break;
      }
    }

بالنسبة لمجموعات القواعد الكبيرة جدًا التي تصل إلى حد 2500 قاعدة بمرور الوقت ، يمكنك إنشاء منطق لحذف أقدم القواعد في دورة زمنية محددة. على سبيل المثال ، لحذف جميع مجموعات القواعد التي تم نشرها لمدة تزيد عن 30 يومًا:

    const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
    const promises = [];
    allRulesets.forEach((rs) => {
      if (new Date(rs.crateTime) < thirtyDays) {
        promises.push(admin.securityRules().deleteRuleset(rs.name));
      }
    });
    await Promise.all(promises);
    console.log(`Deleted ${promises.length} rulesets.`);