- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写 firebase 实时数据库规则,首先,如果 $gameID
恰好有 6 个字符并且 $gameID
没有,则允许创建一个新游戏' 已经存在于 games
节点上。在创建新游戏时,这条规则实际上非常有效。
当玩家随后尝试加入该游戏时,问题就来了:上述验证规则拒绝了他们,因为它要求游戏不存在 - 但我只想要该规则 — "$gameID.length === 6 && !data.exists()"
— 仅在 games/$gameID
上验证写入,而不是在 games/$gameID/players
上验证。
我的理解是 .validate
规则不会向下级联,那么为什么不允许写入 games/$gameID/players
?
我当前的 database.rules
文件是:
{
"rules": {
"games": {
"$gameID": {
".read": "auth !== null",
".write": "auth !== null",
".validate": "$gameID.length === 6 && !data.exists()",
"players": {
".read": "auth !== null",
".write": "auth !== null"
}
}
}
}
}
players
的 javascript 代码是:
await push(ref(db, `games/${gameID}/players`), playerName)
最佳答案
当安全规则谈到“级联规则”时,这是指更高层的 ".read"
和 ".write"
规则将覆盖任何嵌套的行为规则(成功的更高层规则将覆盖失败的嵌套规则)。这与 ".validate"
规则形成对比,其中链中的每个规则都必须评估为 true
才能成功写入(成功的更高层规则不会覆盖嵌套规则失败)。
根据您的评论,您的数据如下所示:
{
"games": {
"abcdef": {
"players": {
"-MoSHoV6kC4cV_jCdssT": "player A",
"-MoSI4begYNOBYVmiVBi": "not player A",
"-MoSI5nVWYD5VnSaaWP0": "tom"
}
},
/* more rooms */
}
}
当前规则的问题在于您必须允许创建房间,并且还必须允许玩家加入该房间。正如您推断的那样,您的规则允许第一个操作,但阻止第二个操作。
要解决此问题,您需要对基于客户端的代码稍作调整,以便区分“我正在创建此房间”和“我正在加入此房间”操作。在当前结构下,我看不出这是怎么可能的,因为这两个操作之间没有任何区别 - 它们看起来都像:
SET /games/abcdef/players/-MoSHoV6kC4cV_jCdssT = "some user"
SET /games/abcdef/players/-MoSI4begYNOBYVmiVBi = "not player A"
应允许创建房间的请求中的哪一个?
为此,我们需要引入一种方法来告诉数据库“我正在创建这个房间”。我们可以通过添加一个新的“所有者”属性来做到这一点,该属性允许我们应用以下规则:
因为您的用户已登录,所以您应该使用他们的用户 ID 而不是推送 ID 来帮助以后保持房间安全,尽管即使您不切换,以下设置仍然有效。
{
"games": {
"abcdef": {
"players": {
"BzzmNyT7hlMz3ElRLMYS0jaGKgE3": "player A",
"BSfHksARFnYco5LenfxevOpnwe63": "not player A",
"vDnPE4DqE3cz1IYHwXQvDFw3W7r2": "tom"
},
"owner": "BzzmNyT7hlMz3ElRLMYS0jaGKgE3"
},
/* more rooms */
}
}
规则:
{
"rules": {
"games": {
"$gameID": {
// any authenticated user may read this entire room's data
// future: restrict to only members?
".read": "auth !== null",
// a room must have an ID of 6 characters
// and must have an owner assigned to it
".validate": "$gameID.length === 6 && newData.hasChild('owner')",
"players": {
// use $pushId here if keeping your "push" method instead of switching to user IDs
"$playerId": {
// only the owner may add/remove players
".write": "auth !== null && newData.parent().child('owner').val() == auth.uid",
// as long as the value is a string
".validate": "newData.isString()"
}
},
"owner": {
// an owner prop can be created, but not edited/deleted
".write": "auth !== null && !data.exists()"
// an owner prop must be the writer's user ID
".validate": "newData.isString() && newData.val() === auth.uid"
}
}
}
}
}
注意:上述规则对房间的所有者也是玩家的 Assets 没有任何影响。
关于Firebase 实时数据库规则 : Validation is cascading to child. 如何忽略父节点上的 .validate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69921744/
我正在使用 JavaFX 8 创建一个应用程序。我使用拖/放动态更改网格 Pane 的内容。我希望每行或每行/列迭代 GridPane 内容。JavaFX 允许通过指定行和列在 GridPane 中添
我正在尝试将图像拖放到div上。图像没有被拖到div上并给出以下错误 Uncaught TypeError: Failed to execute 'appendChild' on 'Node': pa
我正在 android studio 中创建内部构建 AR 导航。我正在寻找一种方法将 anchor 与其他 anchor 或 anchor 节点/节点“连接”起来。我不确定使用哪一个。基于我将强制用
我在 Hive 上运行一些作业:首先是 4 节点,然后是 2 节点。令我惊讶的是,我的 2 节点性能比我的 4 节点更好。 首先,我在一个 4 节点(4 个事件节点)上运行查询,然后关闭 2 个节点(
我有 Node* current ,我在其中存储指向列表“顶部”当前节点的指针。当我将一个新节点设置为当前节点时,出现错误: '=' : cannot convert from 'CircularDo
我是 dcos Mesos 的新手,在本地 Ubuntu 机器上安装了 dc os。 我可以查看 dcos 仪表板。 但我无法使用 dcos node ssh --master-proxy --lea
在 JavaFX 中,是否有类似 setLayout(); 的东西?或 setBounds(); ? 例如,我想将按钮定位到我想要的位置。 最佳答案 JavaFX 场景图上的所有内容都是 Node .
我正在开发一个 JavaFX 应用程序,其中我开发的类(从 javafx.scene.Parent 扩展)是根据用户在 ListView 控件中单击的条目动态创建的。 只是要清楚这个节点,它不是使用像
我正在尝试为节点-边缘关系创建一个类图,因为它可以在有向图中找到。我想传达的是,Nodes 引用了 Edges,Edges 也引用了 Nodes。每个 Edge 都恰好需要两个 Node(源和目标)。
在mapreduce作业期间,单个任务将在随机节点上运行,是否有任何方法限制应在其中运行任务的节点? 最佳答案 Hadoop不会选择节点来随机运行任务。考虑到数据局部性,否则将有很多网络开销。 任务与
有什么区别: a) nodetool 重建 b) nodetool 修复 [-pr] 换句话来说,各个命令到底是做什么的? 最佳答案 nodetool重建:类似于引导过程(当您向集群添加新节点时),但
我已将第一个 OneToMany 关系添加到我的 hibernate 3.6.10 项目中。这是一个类: /** * */ package com.heavyweightsoftware.leal
是否有可能找到正在监听触发当前函数的事件的元素? 在下面的代码中,event.target 返回 #xScrollPane 和 event.currentTarget 和 event 的最低子节点.f
我正在尝试覆盖我数据库中的一些数据。结构很简单,就是: recipes { user_1{ recipe_1{data} recipe_2{data} } user_2{
我使用 setInterval 来运行该函数,但它会多次执行函数 2... 如何在输入中插入一个值后执行函数 第一个输入与其余输入的距离不同 如何在插入 val(tab 选项)后将插入从 1 个输入移
我不知道代码有什么问题,但在 visual studio 中不断收到这些错误消息。 Error 18 error C1903: unable to recover from previous e
我正在尝试从其类中获取 SharePoint 搜索导航节点的对象。 var nodes = $("div.ms-qSuggest-listItem"); 我正在获取节点对象,现在想要获取“_promp
D:\nodeP>node main.js module.js:327 抛出错误; ^ 错误:在 Function.Module 的 Function.Module._resolveFilename
struct node{ int key, prior, cnt, val; node *l, *r; node(){} node(int nkey) : key(nkey),
我有以下代码使用迭代器将项目插入双链表。这就是我们被要求这样做的方式。代码有效,但问题是我有 24 字节的绝对内存泄漏。 NodeIterator insert(NodeIterator & itrP
我是一名优秀的程序员,十分优秀!