Firebase 实时数据库规则检查数组包含

Max*_*tel 7 firebase firebase-security firebase-realtime-database

我的身份验证令牌包含一个stores属性。该属性是一个数组,其中包含允许用户访问的所有商店的 ID。例如: stores: ['abc123', 'def456']

现在,在我的 Firebase 实时数据库中,我正在保存存储特定数据,如下所示:

{
  "stores": {
    "abc123": {
      "data": "mydata"
    },
    "def456": {
      "data": "mydata"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

stores如果用户的属性数组包含他们想要访问的 storeID 特定数据,则允许用户访问实时数据库数据。

我希望我的规则如下:

{
  "rules": {
    "stores": {
      "$store_id": {
        ".read": "auth.token.stores.includes($store_id)"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这不可能。我收到以下错误:

Error saving rules - line 5: type error: function call on target that is not a function.

是否可以在 firebase 规则中搜索令牌属性数组,还是必须使用对象?感谢您的任何答复!

Dha*_*raj 6

Firebase 实时数据库没有任何方法includes()来检查数组中是否存在值。您可以将声明存储为映射而不是数组,如下所示:

// custom claims
{
  stores: {
    store1: true,
    store2: true,
    store3: false
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下规则来检查用户是否有权访问特定商店:

{
  "rules": {
    "stores": {
      "$store_id": {
        ".read": "auth.token.stores[$store_id] == true"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


小智 -1

您可以使用列表in中的运算符

v in x
检查值 v 是否存在于列表 x 中。

'a' in ['a','b'] == true
Run Code Online (Sandbox Code Playgroud)

安全规则示例 如何完成

'a' in ['a','b'] == true
Run Code Online (Sandbox Code Playgroud)