我对firebase实时数据库规则有疑问。
有人创建了一个帐户,该帐户在实时数据库中创建了一个路径:
结构很简单(键,用户ID和其他数据)。
这是我的规则:
{
/* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
"rules": {
"waitingForApproval": {
"$uid": {
".write": true,
".read": "auth != null && $uid === auth.uid"
}
},
}
}
但是现在出现了问题。如何允许用户写入该对象?拥有代码(请参见BQUyhq)w3D的每个人都可以写入对象ID。如果没有代码,他们将无法写入。
有可能这样吗?如果是这样,我该怎么办。
答案 0 :(得分:0)
我可以想到两种处理此类问题的方法:
1。使用云功能:
设置写入false
的规则,并使用云功能进行更新。云功能将把代码作为输入,验证它是否与期望的代码匹配,并代表用户执行更新。例如:
const functions = require('firebase-functions');
const admin = require('firebase-admin');
exports.updateObject = functions.https.onCall((data, context) => {
const uid = data.uid;
const code = data.code;
const codeRef = admin.database().ref(`waitingForApproval/${uid}/code`);
return codeRef.once('value').then((codeSnapshot) => {
if (codeSnapshot.val() === code) {
// Make updates on the user's behalf
}
});
});
2。在数据库中存储用户输入的代码:
添加一个用户可编辑的部分,用户可以在其中设置其代码并对此进行验证,例如:
用户输入代码后的数据库:
"userCodes": {
"bXUQ6PRNqvOgjwoAlm6HmYuWiYo1": {
"BQUyhq)w3D": true,
},
...
}
设置您的规则,以检查用户是否已设置对象的代码:
"waitingForApproval": {
"$uid": {
".write": "root.child('userCodes').child($uid).child(data.child('code').val()).val() == true"
".read": "auth != null && $uid === auth.uid"
}
},
在允许写入之前,实质上检查userCodes/{uid}/{code}
是否设置为true
。
(请注意,使用此方法,您的代码不能在其键中包含firebase不支持的字符:。$#[] /)