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 CLI配置Firebase項目時,會在項目目錄中創建.rules配置文件。使用以下命令開始配置Firebase項目:

Cloud 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模擬器在本地測試您的更新,並確認您的應用程序規則顯示您想要的行為。

部署您的更新

更新並測試了規則後,請將其部署到生產環境中。使用以下命令有選擇地單獨部署規則,或將其作為常規部署過程的一部分進行部署。

Cloud Firestore

第0632章

實時數據庫

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

存儲

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

使用Firebase控制台

您還可以從Firebase控制台編輯和部署規則。

編輯和更新您的規則

  1. 打開Firebase控制台,然後選擇您的項目。
  2. 然後,從產品導航中選擇“實時數據庫” ,“ Cloud Firestore”或“存儲”,然後單擊“規則”以導航到“規則”編輯器。
  3. 直接在編輯器中編輯規則。

測試您的更新

您可以使用“規則模擬器”直接在Firebase控制台中測試“規則”行為。在“規則”編輯器中打開“模擬器”屏幕,修改設置,然後單擊“運行” 。在編輯器頂部查找確認消息。

部署您的更新

當您對自己的更新感到滿意後,請點擊發布

使用管理SDK

您可以使用Admin SDK for Node.js來以編程方式創建,管理和部署安全規則。通過此程序訪問,您可以:

  • 實施用於管理規則的自定義工具,腳本,儀表板和CI / CD管道。
  • 跨多個Firebase項目更輕鬆地管理規則。

以編程方式更新規則時,避免對應用程序的訪問控制進行意外更改非常重要。編寫Admin SDK代碼時要特別注意安全性,尤其是在更新或部署規則時。

要記住的另一件重要事情是,Firebase安全規則需要幾分鐘才能完全部署。使用Admin SDK部署規則時,請確保避免出現競爭情況,在這種情況下,您的應用立即依賴尚未完成部署的規則。如果您的用例需要頻繁更新訪問控制規則,請考慮使用Cloud Firestore解決方案,該解決方案旨在儘管頻繁更新也可以減少競爭狀況。

另請注意以下限制:

  • 序列化時,規則必須小於64 KiB的UTF-8編碼文本。
  • 一個項目最多可以有2500個已部署的規則集。一旦達到此限制,您必須先刪除一些舊規則集,然後再創建新規則集。

創建和部署存儲或Cloud Firestore規則集

使用Admin SDK管理安全規則的典型工作流程可能包括三個獨立的步驟:

  1. 創建規則文件(可選)
  2. 創建一個規則集
  3. 發布或部署新規則集

SDK提供了一種方法,可以將這些步驟組合為用於存儲和Cloud Firestore安全規則的單個API調用。例如:

    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);

更新實時數據庫規則集

要更新管理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.`);