【问题标题】:firebase rule - retrieve only items where child has certain valuefirebase 规则 - 仅检索子项具有特定价值的项目
【发布时间】:2020-07-02 17:14:42
【问题描述】:

有没有办法添加一个 firebase 安全规则,以防止根据每个子项中的值读取集合中的某些项? 我的例子: JSON:

orders{
  orderA: {
    name: x,
    company:a
    isDeleted: true
  }
  orderB: {
    name: y,
    company:a
    isDeleted: false
  }
}

最好限制用户只能读取 isDeleted === false 的所有订单

我目前的规则(不工作):

"rules": {
    "orders": {
      ".indexOn": "companyId",
      ".read": "auth !== null && data.child('isDeleted').val() === false",
      "$ord": {
        ".write": etc
      }
    },...

上述方法不起作用,因为“数据”不代表正确的对象 - 我只能使用“$res”区域内的数据。 如果我删除 "&& data.child('isDeleted').val() === false" 它可以工作,但当然会带回两条记录。

我的请求是这样的,所以 $res 不适用 - 因为我收到的是 companyId 的所有订单 http://mysite.firebase.io/orders?auth="xyz"&orderBy="companyId"&equalTo="a"

是否有可能像这样“检索所有”类型的 REST 调用并通过 firebase 安全规则过滤掉某些值?我是否也可以检索所有内容,然后在将它们返回到前端时将它们过滤掉??

【问题讨论】:

    标签: firebase rest firebase-realtime-database firebase-security


    【解决方案1】:

    Firebase 的服务器端安全规则不会过滤数据。我强烈建议您查看documentation 和之前的一些questions on this topic,因为这是一个非常常见的误解。

    相反,规则只是确保任何读取(在这种情况下)操作都符合您的要求。因此,对于您的 ".read": "auth !== null && data.child('isDeleted').val() === false", 规则,这意味着服务器检查用户是否已登录(他们已登录),并且他们正在读取的节点有一个子 isDeleted 是错误的。由于/orders/isDeleted 不存在,读取被拒绝。

    可以通过将只选择未删除节点的查询与验证该查询的安全规则相结合,安全地允许仅访问未删除的数据。根据query based rules 上的文档中的示例,该示例类似于:

    "rules": {
      "orders": {
        ".indexOn": "companyId",
        ".read": "auth !== null && 
                  query.orderByChild == 'isDeleted' &&
                  query.equalTo == false"
      }
    }
    

    这将仅用于获取未删除的节点。但是由于您只能对一个属性进行排序/过滤,因此您不能同时对companyId 进行过滤。您可以通过引入合成的isDeleted_companyId 属性来实现这一点,如我在此处的回答所示:Query based on multiple where clauses in Firebase

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 2021-12-25
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多