【问题标题】:Firebase security rules ensure children conditionalFirebase 安全规则确保儿童有条件
【发布时间】:2016-01-08 21:19:51
【问题描述】:

我正在使用 Firebase Bolt Compiler 来构建我的安全规则,我遇到了以下情况:

  • 我有一些嵌套数据想以以下形式发布到 Firebase:

    data: {
      a: //Number, must always be present
      b: //Number, conditionally present (condition B)
      c: //Number, conditionally present (condition C)
    }
    
  • 条件 B 和 C 是基于一条数据,其他地方是 Firebase,如果满足,我希望包含的值,但如果不满足,我希望值为 null

    root.condition >= 5  //condition B
    root.condition >= 10 //condition C
    

以下是我尝试使用 Bolt 构建这些规则:

type ConditionB extends Number {
  validate() = root.condition >= 5 ? this != null : this == null;
} 

type ConditionC extends Number {
  validate() = root.condition >= 10 ? this != null : this == null;
}

type Data {
  a: Number,
  b: ConditionB,
  c: ContitionC
}

path /data is Data {
  read()  = true,
  write() = true
}

下面是 rules.json:

"rules": {
  "data": {
    ".validate": "newData.hasChildren(['a', 'b', 'c']),
    ...
  }
}

可以看出.validate 规则强制所有孩子都出现在data 中。那么,根据我的情况,如何确保 .validate 及其每个子级的 .validate 规则都是正确的?

【问题讨论】:

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


    【解决方案1】:

    由于您的类型可以为 Null,因此您必须扩展 Number |像这样为空:

    type ConditionB extends Number | Null {
      validate() = root.condition >= 5 ? this != null : this == null;
    }
    
    type ConditionC extends Number | Null {
      validate() = root.condition >= 10 ? this != null : this == null;
    }
    
    type Data {
      a: Number,
      b: ConditionB,
      c: ConditionC
    }
    
    path /data is Data {
      read() = true;
      write() = true;
    }
    

    这会产生以下 JSON 规则文件:

    {
      "rules": {
        "data": {
          ".validate": "newData.hasChildren(['a'])",
          "a": {
            ".validate": "newData.isNumber()"
          },
          "b": {
            ".validate": "(newData.isNumber() || newData.val() == null) && (newData.parent().parent().child('condition').val() >= 5 ? newData.val() != null : newData.val() == null)"
          },
          "c": {
            ".validate": "(newData.isNumber() || newData.val() == null) && (newData.parent().parent().child('condition').val() >= 10 ? newData.val() != null : newData.val() == null)"
          },
          "$other": {
            ".validate": "false"
          },
          ".read": "true",
          ".write": "true"
        }
      }
    }
    

    【讨论】:

    • 提示:如果您不喜欢看到 newData.parent()...,请在验证表达式中使用prior(root)。
    • 感谢您的回答和额外提示!我没有意识到您可以在extend 中输入或输入,很高兴看到将其添加到文档中(或者可能是并且我跳过了它:))
    猜你喜欢
    • 2017-06-13
    • 1970-01-01
    • 2016-10-31
    • 2020-08-27
    • 1970-01-01
    • 2016-06-27
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多