我正在使用 Firebase 实时数据库(使用 Angular 9),并且我需要设置一些规则来仅当用户拥有密码时才能访问这些数据。此外,如果他有密码,他可以更改它。
这是我的数据库:
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”的会话(如果存在)并且我有我可以读取和修改数据的密码,如果存在并且我没有我无法读/写但我可以知道的密码如果存在,因为如果它不存在,我可以使用该名称创建一个新会话。
角代码:
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'而不是会话数据。
太感谢了!=)