【发布时间】:2020-05-05 23:22:03
【问题描述】:
我正在使用 Firebase 实时数据库(使用 Angular 9),并且我需要设置一些规则以仅在用户拥有 PIN 码时才能访问此数据。此外,如果他有 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 实时数据库中您无法读取元素的一部分,这里的问题是我想知道具有该键的元素是否存在让我仅在有密码。
例如,我搜索名为“session_three”的会话(如果存在)并且我有我可以读取和修改数据的密码,如果存在并且我没有我无法读取/写入的密码但是我可以知道是否存在,因为如果它不存在,我可以使用该名称创建一个新会话。
角度代码:
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();
});
});
效果很好,问题是在“快照”中,当我输入正确的会话名称和密码时,响应是“空”而不是会话数据。
非常感谢! =)
【问题讨论】:
标签: javascript firebase firebase-realtime-database firebase-security