Firebase实时数据库写入规则

时间:2019-05-24 16:10:40

标签: firebase firebase-realtime-database firebase-security-rules

我对firebase实时数据库规则有疑问。

有人创建了一个帐户,该帐户在实时数据库中创建了一个路径:

结构很简单(键,用户ID和其他数据)。

enter image description here

这是我的规则:

{
  /* 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。如果没有代码,他们将无法写入。

有可能这样吗?如果是这样,我该怎么办。

1 个答案:

答案 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不支持的字符:。$#[] /)