Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

安全規則語言

Firebase安全規則利用靈活,功能強大的自定義語言來支持各種複雜性和粒度。您可以根據自己的應用合理或具體地制定規則。實時數據庫規則使用的語法類似於JSON結構中的JavaScript。 Cloud Firestore和Cloud Storage規則使用基於Common Expression Language(CEL)的語言,該語言基於具有matchallow語句的CEL構建,該語句支持有條件授予訪問權限。

但是,由於這些是自定義語言,因此需要學習。當您深入研究更複雜的規則時,請使用本指南來更好地理解規則語言。

選擇一種產品以了解有關其規則的更多信息。

基本結構

Cloud Firestore

Cloud Firestore和Storage中的Firebase安全規則使用以下結構和語法:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

建立規則時,以下關鍵概念非常重要:

  • 請求:allow語句中調用的方法。這些是您允許運行的方法。標準方法是: getlistcreateupdatedeletereadwrite便利方法可在指定的數據庫或存儲路徑上進行廣泛的讀取和寫入訪問。
  • 路徑:數據庫或存儲位置,以URI路徑表示。
  • 規則: allow語句,其中包含一個條件,如果條件為true,則該條件允許請求。

這些概念的每一個將在下面進一步詳細描述。

雲儲存

Cloud Firestore和Storage中的Firebase安全規則使用以下結構和語法:

service <<name>> {
  // Match the resource path.
  match <<path>> {
    // Allow the request if the following conditions are true.
    allow <<methods>> : if <<condition>>
  }
}

建立規則時,以下關鍵概念非常重要:

  • 請求:allow語句中調用的方法。這些是您允許運行的方法。標準方法是: getlistcreateupdatedeletereadwrite便利方法可在指定的數據庫或存儲路徑上進行廣泛的讀取和寫入訪問。
  • 路徑:數據庫或存儲位置,以URI路徑表示。
  • 規則: allow語句,其中包含一個條件,如果條件為true,則該條件允許請求。

這些概念的每一個將在下面進一步詳細描述。

實時數據庫

在實時數據庫中,Firebase安全規則由JSON文檔中包含的類似於JavaScript的表達式組成。

他們使用以下語法:

{
  "rules": {
    "<<path>>": {
    // Allow the request if the condition for each method is true.
      ".read": <<condition>>,
      ".write": <<condition>>,
      ".validate": <<condition>>
    }
  }
}

規則中包含三個基本元素:

  • 路徑:數據庫位置。這反映了數據庫的JSON結構。
  • 請求:這些是規則用於授予訪問權限的方法。 readwrite規則授予廣泛的讀取和寫入訪問權限,而validate規則充當輔助驗證,以基於傳入或現有數據授予訪問權限。
  • 條件:如果請求的評估結果為true,則允許該條件。

規則構造

Cloud Firestore

Cloud Firestore和Cloud Storage中規則的基本元素如下:

  • service聲明:聲明規則適用的Firebase產品。
  • match塊:在規則適用的數據庫或存儲桶中定義路徑。
  • allow語句:提供授予訪問權限的條件,按方法區分。支持的方法包括: getlistcreateupdatedelete和便捷方法readwrite
  • 可選的function聲明:提供合併和包裝條件以在多個規則中使用的功能。

service包含一個或多個match塊, allow塊具有allow語句,這些語句提供了允許訪問請求的條件。 requestresource變量可用於規則條件。 Firebase安全規則語言還支持function聲明。

語法版本

syntax語句指示用於編寫源的Firebase規則語言的版本。該語言的最新版本是v2

rules_version = '2';
service cloud.firestore {
...
}

如果未提供rules_version語句,則將使用v1引擎評估您的規則。

服務

service聲明定義了您的規則適用於哪種Firebase產品或服務。每個源文件只能包含一個service聲明。

Cloud Firestore

service cloud.firestore {
 // Your 'match' blocks with their corresponding 'allow' statements and
 // optional 'function' declarations are contained here
}

存儲

service firebase.storage {
  // Your 'match' blocks with their corresponding 'allow' statements and
  // optional 'function' declarations are contained here
}

如果要使用Firebase CLI定義Cloud Firestore和存儲的規則,則必須將它們維護在單獨的文件中。

比賽

match塊聲明一個與請求操作的路徑(傳入的request.path )相匹配的path模式。 match的主體必須具有一個或多個嵌套的match塊, allow語句或function聲明。嵌套match塊中的路徑是相對於父match塊中的路徑的。

path模式是類似於目錄的名稱,可能包含變量或通配符。 path模式允許單路徑段和多路徑段匹配。 path中綁定的任何變量在match範圍或聲明該path任何嵌套範圍內都是可見的。

path模式的匹配可能是部分匹配或完全匹配:

  • 部分匹配: path模式是request.path的前綴匹配。
  • 完全匹配: path模式匹配整個request.path

完全匹配後,將評估塊中的規則。進行部分匹配時,將測試嵌套match規則,以查看是否有任何嵌套path完成匹配。

對每個完全match中的規則進行評估,以確定是否允許該請求。如果有任何匹配的規則授予訪問權限,則允許該請求。如果沒有匹配的規則授予訪問權限,則該請求將被拒絕。

// Given request.path == /example/hello/nested/path the following
// declarations indicate whether they are a partial or complete match and
// the value of any variables visible within the scope.
service firebase.storage {
  // Partial match.
  match /example/{singleSegment} {   // `singleSegment` == 'hello'
    allow write;                     // Write rule not evaluated.
    // Complete match.
    match /nested/path {             // `singleSegment` visible in scope.
      allow read;                    // Read rule is evaluated.
    }
  }
  // Complete match.
  match /example/{multiSegment=**} { // `multiSegment` == /hello/nested/path
    allow read;                      // Read rule is evaluated.
  }
}

如上面的示例所示, path聲明支持以下變量:

  • 單段通配符:通配符變量通過將變量包裝在花括號中來聲明: {variable} 。在match語句中可以string形式訪問此變量。
  • 遞歸通配符:遞歸或多段通配符匹配路徑或路徑下方的多個路徑段。該通配符與您設置的位置下方的所有路徑匹配。您可以通過在段變量: {variable=**}的末尾添加=**字符串來聲明它。該變量可在match語句中作為path對象訪問。

允許

match塊包含一個或多個allow語句。這些是您的實際規則。您可以將allow規則應用於一種或多種方法。對於Cloud Firestore或Storage,以允許任何傳入請求, allow語句上的條件必須評估為true。您還可以編寫無條件的allow語句,例如allow read 。但是,如果allow語句不包含條件,則始終允許該方法的請求。

如果滿足該方法的任何allow規則,則允許該請求。此外,如果使用更寬泛的規則來授予訪問權限,則規則會授予訪問權限,並且忽略任何可能限制訪問權限的更精細的規則。

考慮以下示例,其中任何用戶都可以讀取或刪除自己的任何文件。如果請求寫入的用戶擁有文件且文件是PNG,則更細化的規則僅允許寫入。用戶可以刪除子路徑中的任何文件(即使它們不是PNG),因為先前的規則允許這樣做。

service firebase.storage {
  // Allow the requestor to read or delete any resource on a path under the
  // user directory.
  match /users/{userId}/{anyUserFile=**} {
    allow read, delete: if request.auth != null && request.auth.uid == userId;
  }

  // Allow the requestor to create or update their own images.
  // When 'request.method' == 'delete' this rule and the one matching
  // any path under the user directory would both match and the `delete`
  // would be permitted.

  match /users/{userId}/images/{imageId} {
    // Whether to permit the request depends on the logical OR of all
    // matched rules. This means that even if this rule did not explicitly
    // allow the 'delete' the earlier rule would have.
    allow write: if request.auth != null && request.auth.uid == userId && imageId.matches('*.png');
  }
}

方法

每個allow語句都包含一個方法,該方法為相同方法的傳入請求授予訪問權限。

方法請求類型
便利方法
read任何類型的讀取請求
write任何類型的寫請求
標準方法
get讀取單個文檔或文件的請求
list閱讀查詢請求和集合
create編寫新文件或文件
update寫入現有文檔或文件
delete刪除資料

您不能在同一match塊中重疊讀取方法,也不能在同一path聲明中重疊寫入方法。

例如,以下規則將失敗:

service bad.example {
  match /rules/with/overlapping/methods {
    // This rule allows reads to all unauthenticated users
    allow read: if request.auth != null;

    match another/subpath {
      // This secondary, more specific read rule causes an error
      allow get: if request.auth != null && request.auth.uid == "me";
      // Overlapping write methods in the same path cause an error as well
      allow write: if request.auth != null;
      allow create: if request.auth != null && request.auth.uid == "me";
    }
  }
}

功能

隨著安全規則變得越來越複雜,您可能希望將條件集包裝在可以在整個規則集中重複使用的函數中。安全規則支持自定義功能。自定義函數的語法有點像JavaScript,但是安全規則函數是以特定於域的語言編寫的,該語言具有一些重要的局限性:

  • 函數只能包含一個return語句。它們不能包含任何其他邏輯。例如,他們不能執行循環或調用外部服務。
  • 函數可以在定義它們的範圍內自動訪問函數和變量。例如,該內限定的功能service cloud.firestore範圍有權訪問resource變量和內置函數如get()exists()
  • 函數可以調用其他函數,但不能遞歸。總調用堆棧深度限制為20。
  • 在規則版本v2 ,函數可以使用let關鍵字定義變量。函數最多可以包含10個let綁定,但必須以return語句結尾。

函數是使用function關鍵字定義的,並且接受零個或多個參數。例如,您可能要將以上示例中使用的兩種類型的條件合併為一個函數:

service cloud.firestore {
  match /databases/{database}/documents {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }

    match /cities/{city} {
      allow read, write: if signedInOrPublic();
    }

    match /users/{user} {
      allow read, write: if signedInOrPublic();
    }
  }
}

這是顯示函數參數和let賦值的示例。 Let賦值語句必須用分號分隔。

function isAuthorOrAdmin(userId, article) {
  let isAuthor = article.author == userId;
  let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
  return isAuthor || isAdmin;
}

請注意isAdmin分配如何強制執行admins集合的查找。對於懶惰的評估,而無需不必要的查找,請利用&& (AND)和||的短路特性。 (OR)比較以僅在isAuthor顯示為true(用於&&比較)或false(對於||比較)時調用第二個函數。

function isAdmin(userId) {
  return exists(/databases/$(database)/documents/admins/$(userId));
}
function isAuthorOrAdmin(userId, article) {
  let isAuthor = article.author == userId;
  // `||` is short-circuiting; isAdmin called only if isAuthor == false.
  return isAuthor || isAdmin(userId);
}

隨著規則復雜性的增加,在安全規則中使用函數使它們更易於維護。

雲儲存

Cloud Firestore和Cloud Storage中規則的基本元素如下:

  • service聲明:聲明規則適用的Firebase產品。
  • match塊:在規則適用的數據庫或存儲桶中定義路徑。
  • allow語句:提供授予訪問權限的條件,按方法區分。支持的方法包括: getlistcreateupdatedelete和便捷方法readwrite
  • 可選的function聲明:提供合併和包裝條件以在多個規則中使用的功能。

service包含一個或多個match塊, allow塊具有allow語句,這些語句提供了允許訪問請求的條件。 requestresource變量可用於規則條件。 Firebase安全規則語言還支持function聲明。

語法版本

syntax語句指示用於編寫源的Firebase規則語言的版本。該語言的最新版本是v2

rules_version = '2';
service cloud.firestore {
...
}

如果未提供rules_version語句,則將使用v1引擎評估您的規則。

服務

service聲明定義了您的規則適用於哪種Firebase產品或服務。每個源文件只能包含一個service聲明。

Cloud Firestore

service cloud.firestore {
 // Your 'match' blocks with their corresponding 'allow' statements and
 // optional 'function' declarations are contained here
}

存儲

service firebase.storage {
  // Your 'match' blocks with their corresponding 'allow' statements and
  // optional 'function' declarations are contained here
}

如果要使用Firebase CLI定義Cloud Firestore和存儲的規則,則必須將它們維護在單獨的文件中。

比賽

match塊聲明一個與請求操作的路徑(傳入的request.path )相匹配的path模式。 match的主體必須具有一個或多個嵌套的match塊, allow語句或function聲明。嵌套match塊中的路徑是相對於父match塊中的路徑的。

path模式是類似於目錄的名稱,可能包含變量或通配符。 path模式允許單路徑段和多路徑段匹配。 path中綁定的任何變量在match範圍或聲明該path任何嵌套範圍內都是可見的。

path模式的匹配可能是部分匹配或完全匹配:

  • 部分匹配: path模式是request.path的前綴匹配。
  • 完全匹配: path模式匹配整個request.path

完全匹配後,將評估塊中的規則。進行部分匹配時,將測試嵌套match規則,以查看是否有任何嵌套path完成匹配。

評估每個完全match中的規則,以確定是否允許該請求。如果有任何匹配的規則授予訪問權限,則允許該請求。如果沒有匹配的規則授予訪問權限,則該請求將被拒絕。

// Given request.path == /example/hello/nested/path the following
// declarations indicate whether they are a partial or complete match and
// the value of any variables visible within the scope.
service firebase.storage {
  // Partial match.
  match /example/{singleSegment} {   // `singleSegment` == 'hello'
    allow write;                     // Write rule not evaluated.
    // Complete match.
    match /nested/path {             // `singleSegment` visible in scope.
      allow read;                    // Read rule is evaluated.
    }
  }
  // Complete match.
  match /example/{multiSegment=**} { // `multiSegment` == /hello/nested/path
    allow read;                      // Read rule is evaluated.
  }
}

如上面的示例所示, path聲明支持以下變量:

  • 單段通配符:通配符變量通過將變量包裝在花括號中來聲明: {variable} 。在match語句中可以string形式訪問此變量。
  • 遞歸通配符:遞歸或多段通配符匹配路徑或路徑下方的多個路徑段。該通配符與您設置的位置下方的所有路徑匹配。您可以通過在段變量: {variable=**}的末尾添加=**字符串來聲明它。該變量可在match語句中作為path對象訪問。

允許

match塊包含一個或多個allow語句。這些是您的實際規則。您可以將allow規則應用於一種或多種方法。對於Cloud Firestore或Storage,以允許任何傳入請求, allow語句上的條件必須評估為true。您還可以編寫無條件的allow語句,例如allow read 。但是,如果allow語句不包含條件,它將始終允許該方法的請求。

如果滿足該方法的任何allow規則,則允許該請求。此外,如果使用更寬泛的規則來授予訪問權限,則規則會授予訪問權限,並且忽略任何可能限制訪問權限的更精細的規則。

考慮以下示例,其中任何用戶都可以讀取或刪除自己的任何文件。如果請求寫入的用戶擁有文件且文件是PNG,則更細化的規則僅允許寫入。用戶可以刪除子路徑中的任何文件(即使它們不是PNG),因為先前的規則允許這樣做。

service firebase.storage {
  // Allow the requestor to read or delete any resource on a path under the
  // user directory.
  match /users/{userId}/{anyUserFile=**} {
    allow read, delete: if request.auth != null && request.auth.uid == userId;
  }

  // Allow the requestor to create or update their own images.
  // When 'request.method' == 'delete' this rule and the one matching
  // any path under the user directory would both match and the `delete`
  // would be permitted.

  match /users/{userId}/images/{imageId} {
    // Whether to permit the request depends on the logical OR of all
    // matched rules. This means that even if this rule did not explicitly
    // allow the 'delete' the earlier rule would have.
    allow write: if request.auth != null && request.auth.uid == userId && imageId.matches('*.png');
  }
}

方法

每個allow語句都包含一個方法,該方法為相同方法的傳入請求授予訪問權限。

方法請求類型
便利方法
read任何類型的讀取請求
write任何類型的寫請求
標準方法
get讀取單個文檔或文件的請求
list閱讀查詢請求和集合
create編寫新文件或文件
update寫入現有文檔或文件
delete刪除資料

您不能在同一match塊中重疊讀取方法,也不能在同一path聲明中重疊寫入方法。

例如,以下規則將失敗:

service bad.example {
  match /rules/with/overlapping/methods {
    // This rule allows reads to all unauthenticated users
    allow read: if request.auth != null;

    match another/subpath {
      // This secondary, more specific read rule causes an error
      allow get: if request.auth != null && request.auth.uid == "me";
      // Overlapping write methods in the same path cause an error as well
      allow write: if request.auth != null;
      allow create: if request.auth != null && request.auth.uid == "me";
    }
  }
}

功能

隨著安全規則變得越來越複雜,您可能希望將條件集包裝在可以在整個規則集中重複使用的函數中。安全規則支持自定義功能。自定義函數的語法有點像JavaScript,但是安全規則函數是以特定於域的語言編寫的,該語言具有一些重要的限制:

  • 函數只能包含一個return語句。它們不能包含任何其他邏輯。例如,他們不能執行循環或調用外部服務。
  • 函數可以在定義它們的範圍內自動訪問函數和變量。例如,在service cloud.firestore範圍內定義的函數可以訪問resource變量和內置函數,例如get()service cloud.firestore exists()
  • 函數可以調用其他函數,但不能遞歸。總調用堆棧深度限制為20。
  • 在規則版本v2 ,函數可以使用let關鍵字定義變量。函數最多可以包含10個let綁定,但必須以return語句結尾。

函數是使用function關鍵字定義的,並且接受零個或多個參數。例如,您可能要將以上示例中使用的兩種類型的條件合併為一個函數:

service cloud.firestore {
  match /databases/{database}/documents {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }

    match /cities/{city} {
      allow read, write: if signedInOrPublic();
    }

    match /users/{user} {
      allow read, write: if signedInOrPublic();
    }
  }
}

這是顯示函數參數和let賦值的示例。 Let賦值語句必須用分號分隔。

function isAuthorOrAdmin(userId, article) {
  let isAuthor = article.author == userId;
  let isAdmin = exists(/databases/$(database)/documents/admins/$(userId));
  return isAuthor || isAdmin;
}

請注意isAdmin分配如何強制執行admins集合的查找。對於懶惰的評估,而無需不必要的查找,請利用&& (AND)和||的短路特性。 (OR)比較,以僅在isAuthor顯示為true(用於&&比較)或false(對於||比較)時調用第二個函數。

function isAdmin(userId) {
  return exists(/databases/$(database)/documents/admins/$(userId));
}
function isAuthorOrAdmin(userId, article) {
  let isAuthor = article.author == userId;
  // `||` is short-circuiting; isAdmin called only if isAuthor == false.
  return isAuthor || isAdmin(userId);
}

隨著規則復雜性的增加,在安全規則中使用函數使它們更易於維護。

實時數據庫

如上所述,“實時數據庫規則”包括三個基本元素:作為數據庫JSON結構鏡像的數據庫位置,請求類型和條件授予訪問權限。

數據庫位置

規則的結構應遵循您存儲在數據庫中的數據的結構。例如,在帶有消息列表的聊天應用程序中,您可能具有如下數據:

  {
    "messages": {
      "message0": {
        "content": "Hello",
        "timestamp": 1405704370369
      },
      "message1": {
        "content": "Goodbye",
        "timestamp": 1405704395231
      },
      ...
    }
  }

您的規則應反映該結構。例如:

  {
    "rules": {
      "messages": {
        "$message": {
          // only messages from the last ten minutes can be read
          ".read": "data.child('timestamp').val() > (now - 600000)",

          // new messages must have a string content and a number timestamp
          ".validate": "newData.hasChildren(['content', 'timestamp']) &&
                        newData.child('content').isString() &&
                        newData.child('timestamp').isNumber()"
        }
      }
    }
  }

如上面的示例所示,實時數據庫規則支持$location變量以匹配路徑段。使用路徑段前面的$前綴將規則與路徑上的所有子節點匹配。

  {
    "rules": {
      "rooms": {
        // This rule applies to any child of /rooms/, the key for each room id
        // is stored inside $room_id variable for reference
        "$room_id": {
          "topic": {
            // The room's topic can be changed if the room id has "public" in it
            ".write": "$room_id.contains('public')"
          }
        }
      }
    }
  }

您還可以將$variable與常量路徑名並行使用。

  {
    "rules": {
      "widget": {
        // a widget can have a title or color attribute
        "title": { ".validate": true },
        "color": { ".validate": true },

        // but no other child paths are allowed
        // in this case, $other means any key excluding "title" and "color"
        "$other": { ".validate": false }
      }
    }
  }

方法

在實時數據庫中,存在三種類型的規則。這些規則類型中的兩個- readwrite -應用於收到請求的方法。 validate規則類型將強制數據結構並驗證數據的格式和內容。規則在驗證.write規則授予訪問權限後運行.validate規則。

規則類型
。讀描述是否以及何時允許用戶讀取數據。
。寫描述是否以及何時允許寫入數據。
.validate定義格式正確的值的外觀,是否具有子屬性以及數據類型。

默認情況下,如果沒有允許的規則,則拒絕訪問路徑。

建築條件

Cloud Firestore

條件是一個布爾表達式,它確定是應允許還是拒絕特定的操作。 requestresource變量為這些條件提供了上下文。

request變量

request變量包括以下字段和相應的信息:

request.auth

JSON Web令牌(JWT),其中包含Firebase身份驗證中的身份驗證憑據。 auth令牌包含一組標準聲明以及您通過Firebase身份驗證創建的任何自定義聲明。了解有關Firebase安全規則和身份驗證的更多信息。

request.method

request.method可以是任何標準方法或自定義方法。還存在readwrite的便捷方法,以簡化分別適用於所有隻讀或所有僅寫入標準方法的寫入規則。

request.params

request.params包括與request.resource無關的任何數據,這些數據可能對評估有用。實際上,對於所有標準方法,此映射應為空,並且應包含自定義方法的非資源數據。服務必須小心,不要重命名或修改以參數形式出現的任何鍵和值的類型。

request.path

request.path是目標resource的路徑。路徑是相對於服務的。包含非URL安全字符(例如/路徑段經過url編碼。

resource變量

resource是服務中的當前值,表示為鍵值對映射。在條件內引用resource將導致最多讀取一次該服務的值。此查找將計入資源的任何與服務相關的配額。對於get請求, resource將僅計為拒絕配額。

運算符和運算符優先級

使用下表作為操作員及其在Cloud Firestore和存儲規則中的相應優先級的參考。

給定任意表達式ab ,字段f和索引i

操作員描述關聯性
a[i] a() af索引,呼叫,現場訪問左到右
!a -a一元否定右到左
a/ba%ba*b乘法運算符左到右
a+b ab加法運算符左到右
a>b a>=b a<b a<=b關係運算符左到右
a in ba is b列表或地圖中存在,類型比較左到右
a==ba!=b比較運算符左到右
a && b條件與左到右
a || b有條件或左到右
a ? true_value : false_value三元表達左到右

雲儲存

條件是一個布爾表達式,它確定是應允許還是拒絕特定的操作。 requestresource變量為這些條件提供了上下文。

request變量

request變量包括以下字段和相應的信息:

request.auth

JSON Web令牌(JWT),其中包含Firebase身份驗證中的身份驗證憑據。 auth令牌包含一組標準聲明以及您通過Firebase身份驗證創建的任何自定義聲明。了解有關Firebase安全規則和身份驗證的更多信息。

request.method

request.method可以是任何標準方法或自定義方法。還存在readwrite的便捷方法,以簡化分別適用於所有隻讀或所有僅寫入標準方法的寫入規則。

request.params

request.params包含與request.resource無關的,可能對評估有用的任何數據。實際上,對於所有標準方法,此映射應為空,並且應包含自定義方法的非資源數據。服務必須小心,不要重命名或修改以參數形式出現的任何鍵和值的類型。

request.path

request.path是目標resource的路徑。路徑是相對於服務的。包含非URL安全字符(例如/路徑段經過url編碼。

resource變量

resource是服務中的當前值,表示為鍵值對映射。在條件內引用resource將導致最多讀取一次該服務的值。此查找將計入資源的任何與服務相關的配額。對於get請求, resource將僅計為拒絕配額。

運算符和運算符優先級

使用下表作為操作員及其在Cloud Firestore和存儲規則中的相應優先級的參考。

給定任意表達式ab ,字段f和索引i

操作員描述關聯性
a[i] a() af索引,呼叫,現場訪問左到右
!a -a一元否定右到左
a/ba%ba*b乘法運算符左到右
a+b ab加法運算符左到右
a>b a>=b a<b a<=b關係運算符左到右
a in ba is b列表或地圖中存在,類型比較左到右
a==ba!=b比較運算符左到右
a && b條件與左到右
a || b有條件或左到右
a ? true_value : false_value三元表達左到右

實時數據庫

條件是一個布爾表達式,它確定是應允許還是拒絕特定的操作。您可以通過以下方式在“實時數據庫規則”中定義這些條件。

預定義變量

在規則定義中可以訪問許多有用的預定義變量。這是每個的簡短摘要:

預定義變量
現在自Linux時代以來的當前時間(以毫秒為單位)。這對於驗證使用SDK的firebase.database.ServerValue.TIMESTAMP創建的時間戳特別有用。
一個RuleDataSnapshot,表示Firebase數據庫中嘗試執行操作之前存在的根路徑。
新數據RuleDataSnapshot表示嘗試操作後將存在的數據。它包括正在寫入的新數據和現有數據。
數據RuleDataSnapshot表示嘗試操作之前存在的數據。
$變數通配符路徑,用於表示ID和動態子項。
認證表示經過身份驗證的用戶的令牌有效負載。

這些變量可以在規則中的任何位置使用。例如,以下安全規則確保寫入/foo/節點的數據必須是少於100個字符的字符串:

{
  "rules": {
    "foo": {
      // /foo is readable by the world
      ".read": true,

      // /foo is writable by the world
      ".write": true,

      // data written to /foo must be a string less than 100 characters
      ".validate": "newData.isString() && newData.val().length < 100"
    }
  }
}

基於數據的規則

您的規則中可以使用數據庫中的任何數據。使用預定義的變量rootdatanewData ,您可以訪問寫入事件之前或之後存在的任何路徑。

考慮以下示例,只要/allow_writes/節點的值為true ,父節點沒有設置readOnly標誌,並且新寫入的數據中有一個名為foo的子代,就可以進行寫操作:

".write": "root.child('allow_writes').val() === true &&
          !data.parent().child('readOnly').exists() &&
          newData.child('foo').exists()"

基於查詢的規則

儘管不能將規則用作過濾器,但是可以通過在規則中使用查詢參數來限制對數據子集的訪問。使用query.規則中的表達式,以基於查詢參數授予讀取或寫入訪問權限。

例如,下面的查詢為基礎的規則使用基於用戶的安全規則和基於查詢的規則來限制訪問數據baskets只購物籃活躍用戶擁有的集合:

"baskets": {
  ".read": "auth.uid != null &&
            query.orderByChild == 'owner' &&
            query.equalTo == auth.uid" // restrict basket access to owner of basket
}

以下查詢(包括規則中的查詢參數)將成功:

db.ref("baskets").orderByChild("owner")
                 .equalTo(auth.currentUser.uid)
                 .on("value", cb)                 // Would succeed

但是,在規則中不包含參數的查詢將失敗,並顯示PermissionDenied錯誤:

db.ref("baskets").on("value", cb)                 // Would fail with PermissionDenied

您還可以使用基於查詢的規則來限制客戶端通過讀取操作下載的數據量。

例如,以下規則按優先級將讀取訪問權限限制為僅查詢的前1000個結果:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example queries:

db.ref("messages").on("value", cb)                // Would fail with PermissionDenied

db.ref("messages").limitToFirst(1000)
                  .on("value", cb)                // Would succeed (default order by key)

以下query.實時數據庫規則中提供了表達式。

基於查詢的規則表達式
表達類型描述
query.orderByKey
query.orderByPriority
query.orderByValue
布爾值對於按鍵,優先級或值排序的查詢為True。否則為假。
query.orderByChild
空值
使用字符串表示子節點的相對路徑。例如, query.orderByChild == "address/zip" 。如果查詢不是由子節點排序的,則此值為null。
query.startAt
query.endAt
query.equalTo


布爾值
空值
檢索執行查詢的邊界,如果沒有邊界集,則返回null。
query.limitToFirst
query.limitToLast

空值
檢索執行查詢的限制,如果未設置限制,則返回null。

經營者

實時數據庫規則支持許多運算符,可用於在條件語句中組合變量。請參閱參考文檔中的運算符完整列表。

創建條件

您的實際情況將取決於您要授予的訪問權限。規則有意提供了極大的靈活性,因此您的應用程序規則最終可以變得簡單或複雜。

有關創建簡單的,可用於生產的規則的指導,請參閱《基本安全規則》