输入正确的会话名称和引脚时,响应'null'



我使用的是Firebase实时数据库(带Angular 9(,只有当用户有pin代码时,我才需要设置一些规则来访问这些数据。此外,如果他有密码,他可以更改

这是我的数据库:

sessions
session_one
some_data: 'can',
some_data_2: 'you',
old_pin: 1234,
pin: 1234
session_two
some_data: 'help',
some_data_2: 'me',
old_pin: -1,
pin: -1
session_three
some_data: 'please?',
some_data_2: 'thanks',
old_pin: 5555,
pin: 5555

我的规则:

{
"rules": {
"sessions": {
"$session": {
".indexOn": "pin",
".read": "query.orderByChild === 'pin' &&
query.equalTo === data.child('pin').val()",
".validate": "!data.exists() ||
newData.child('old_pin').val() === data.child('pin').val()"
}
}
}
}

我做了一些研究,发现在Firebase实时数据库中,你无法读取元素的一部分,这里的问题是,我想知道带有该键的元素是否存在,只有当我有pin码时,我才能读取。

例如,我搜索名为"session_three"的会话(如果存在(,我有可以读取和修改数据的pin代码,如果存在,我没有不能读取/写入的pin代码但我可以知道是否存在,因为如果不存在,我可以用该名称创建一个新会话。

角度代码:

this.db.database.ref("sessions/"+this.session).orderByChild('pin').equalTo(this.pin).once('value').then((snap) => {
this.enterInSession(snap);
}).catch(() => {
this.db.database.ref('sessions/' + this.inputSession).set({
some_data: 'loren',
some_data_2: 'ipsum',
old_pin: -1
pin: -1
}).then(() => {
this.enterInSession(this.inputSession);
}).catch(() => {
this.enterPinDialog();
});
});

它工作得很好,问题是在"snap"中,当我输入正确的会话名称和pin时,响应是"null",而不是会话数据。

非常感谢

您需要在运行查询的级别上定义规则。由于查询在/sessions上运行,因此也需要在这里定义.read规则。这也立即说明了为什么这种方法不起作用:在/sessions上,data将引用所有会话的数据,并且没有pin属性来检查的值。

我发现最容易记住的是,当你附加侦听器时,Firebase会强制执行它的安全规则,而在不阅读每个单独的文档的情况下,它没有合理的方法来执行你的规则,这不会"扩展"。


客户端传递到安全规则中的唯一信息是:

  1. 活动用户的身份验证令牌
  2. 正在读取/写入的数据的路径
  3. 如果读取是一个查询,则为查询中的信息

无法将其他自定义信息传递到安全规则中,因此您必须确保这些信息位于上述其中之一。

我对此的常见解决方案是将任何安全信息编码到节点的密钥中。

sessions
session_one_1234
some_data: 'can',
some_data_2: 'you',
old_pin: 1234,
pin: 1234
session_two_-1
some_data: 'help',
some_data_2: 'me',
old_pin: -1,
pin: -1
session_three_5555
some_data: 'please?',
some_data_2: 'thanks',
old_pin: 5555,
pin: 5555

现在,您需要使用原始密钥(如session_one文档的PIN(来构建其路径,这是读取文档所必需的。

与此相关的更简单的规则:

{
"rules": {
"sessions": {
"$session": {
".read": true, // if you know the path, you can read it
}
}
}
}

只要您不授予用户读取所有/sessions的权限,他们就不可能找到会话节点的密钥。

最新更新