Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 多更新事务的Firebase数据库规则_Javascript_Json_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

Javascript 多更新事务的Firebase数据库规则

Javascript 多更新事务的Firebase数据库规则,javascript,json,firebase,firebase-realtime-database,firebase-security,Javascript,Json,Firebase,Firebase Realtime Database,Firebase Security,我正在尝试从中为“将数据另存为事务”博客应用程序示例创建安全规则 用户可以增加或减少帖子的星数,同时将自己的UID包括在节点中或从节点中删除 我写了以下规则: (我删除了计数器增加/减少的规则,因为它们超出了问题的范围) 以及stars节点的一个示例: “stars”: { “postId1”: { starCount: 2, "users": { “userId1”: true, “userId2”:

我正在尝试从中为“将数据另存为事务”博客应用程序示例创建安全规则

用户可以增加或减少帖子的星数,同时将自己的UID包括在节点中或从节点中删除

我写了以下规则: (我删除了计数器增加/减少的规则,因为它们超出了问题的范围)

以及stars节点的一个示例:

“stars”: {

    “postId1”: {
        starCount: 2,

        "users": {
            “userId1”: true,
            “userId2”: true
        }
    }
}
在将用户添加到“用户”节点时,这些规则可以正常工作,但在删除时会出现问题

卑鄙的用户可以从“用户”节点删除任何其他用户,只需使用空节点更新它。或者是一个包含以前所有用户的节点,减去他选择删除的一个。 “.validate”规则(“$userId==auth.uid”)对于提交的空节点不起作用,我无法编写检查更新之前数据库中的所有用户在更新之后是否仍然存在的规则

如果不使用事务,我解决问题的方法是将“.write”规则移动到“$userId”下,一次只为一个用户限制uptate,并且只使用与登录用户相同的UID

比如:

“stars”: {

    ".read": true,

    "$postId”: {
        "users": {
            "$userId": {
                ".write": "auth != null && $userId === auth.uid"
            }
        }
    }
    "starCount": {
        ".write": true
}
但是,由于我使用事务进行数据库更新,我需要“$postId”下的“.write”规则,允许同时更新“users”节点和“starCount”节点。在我的上一个示例中,这是不可能的(没有“$postId”下的“.write”规则)

所以这看起来像是第二十二条军规。或者我使用事务,但我不能用规则保护starCount,或者我作为一个普通的多重更新来做,但由于增加计数器而失去了并发性的好处


如何正确保护“将数据另存为事务”博客应用程序示例

在Firebase中,您可以使用他们调用的东西进行原子更新。您这样做时是否仍然存在交易问题?这篇stackoverflow帖子描述了类似的事情:@Lyla我知道“深度路径更新”,这就是我(错误地)所说的“多重更新”。但我不认为有一种方法可以进行“深度路径更新”,其中一种更新是“事务操作”(例如,增加/减少计数器)。因此,如果这样做,我就失去了事务操作的并发优势,并有可能损坏计数器。@Lyla实际上,你给我的堆栈溢出帖子非常有用。它使用“深度路径更新”进行更新,并使用规则实现“事务”。如果在更新之前其他用户更改了值,我仍然需要执行重试,这是我在客户端上通过“事务”模型免费获得的,但至少它应该可以工作。谢谢您最终要做的是使用客户端代码和服务器端安全规则来编写您自己的“类似事务”机制,以强制执行您的约束。另一个回答是,我涉及一个类似的场景:@Dan Flict:我同意。。似乎没有办法确保Firebase指南中详述的交易安全。使事务正常工作的唯一方法是在“stars”节点(例如,非用户特定)中设置全局读取和权限,这是不安全的。Frank van Puffelen的答案是我遇到的最好的答案,尽管它仍然需要一个解决方案来处理同时写入的失败:(
“stars”: {

    ".read": true,

    "$postId”: {
        "users": {
            "$userId": {
                ".write": "auth != null && $userId === auth.uid"
            }
        }
    }
    "starCount": {
        ".write": true
}