【问题标题】:How to create a security rule depending on different generic nodes?如何根据不同的通用节点创建安全规则?
【发布时间】:2021-09-11 21:43:26
【问题描述】:

我想实现一个规则,检查当前节点中输入的新数据是否低于我在同一请求中更新的另一个节点中的新数据。 我用一些代码解释自己:

// x1 and x2 are some Integer
let update : [String : Any] = [
            "/Users/\(userId!)/A" : ServerValue.increment(NSNumber(value : x1)),
            "/Feedback/\(userId!)/B" : x2
        ]
        
        dbRef.updateChildValues(update)

这是规则:

".validate" : "newData.isNumber() && (root.child('Users').child('$uid').child('A').val() >= newData.val())"

我有两个问题:

  • 由于 B 的安全规则取决于 A 的新值,我确定 A 在 B 的更新之前已被修改(因为在代码中,A 的更新放在 B 的更新之前)。
  • 为什么我的 B 规则不起作用(无论 B 是在 A 之前还是之后更新,因为我的测试差异如此之大以至于它不应该拒绝请求),我见过类似的例子在网上挖掘,语法看起来不错。

感谢您的关注!

【问题讨论】:

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


    【解决方案1】:

    newData 变量包含写入操作完成后将存在的数据(假设允许)。

    所以您的newData.isNumber() 会检查节点的new 值。

    但是您的root.child('Users')... 正在检查数据库中的当前 数据,所以在写入操作之前。由于您要检查写入后的值,因此您必须根据需要多次调用 parent()newData 导航到根目录。因此,如果您的问题中的规则是在 /Feedback/$uid/B 上定义的,那就是:

    newData.parent().parent().child('Users')...
    

    这看起来也是个错误:

    child('$uid')
    

    这会尝试使用文字字符串'$uid',而您更可能希望使用$uid 变量的值。那是:

    child($uid)
    

    【讨论】:

    • 好的,所以每次进行查询时都会生成具有新值的数据库的完整副本?
    • 操作的实现方式对其工作方式并不重要,但我怀疑它会复制整个数据库。它是否使我的回答回答了您原始问题中的两个要点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2019-03-19
    相关资源
    最近更新 更多