当前位置: 首页 > 知识库问答 >
问题:

Firebase实时数据库写入规则

曾翰飞
2023-03-14

我有一个关于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。如果没有代码,他们就无法写入对象id。

有可能发生这样的事吗?如果是的话,我该怎么做呢。

共有1个答案

邹博裕
2023-03-14

我可以想出两种方法来处理这样的事情:

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键中不支持的字符:.$#[]/)

 类似资料:
  • 好的,我有一个实时数据库连接到一个应用程序,直到今天规则(读写)都设置为真,一切都很好。。。。但每次有消息说 您的安全规则定义为public,因此任何人都可以窃取、修改或删除数据库中的数据 我尝试了几件事,但没有访问数据。。。只有当规则设置为true时,才能访问数据 但有没有办法修改规则,使其更安全 我希望只有少数已知的应用程序(我的应用程序)可以访问此数据

  • 我尝试用规则返回用户聊天列表。所以我不知道对话的id。我尝试了几种方法,但都不起作用,因为你必须知道聊天id。 数据库: 规则: 但当我从react本机应用程序访问时。通过身份验证的用户无法访问聊天记录(uid:3Oi1atf8l2P4Vgsb8tZOGxpUg7q2) *读取失败:错误:权限被拒绝/Chats:客户端没有访问所需数据的权限。 规则: 查询:

  • 我使用以下规则检查只有“管理员”才能写入陷阱部分。 这个很好用。但是如果我把规则改为, 然后我得到了一个权限错误。W/SyncTree:侦听/traps失败:数据库错误:权限被拒绝。 我之所以改变结构,是因为我试图使用validate函数,但由于我无法通过第一个问题,我无法达到验证的程度。 我肯定这是一个新手理解错误,但在尝试了许多排列后,我在这方面进展甚微。您的协助将不胜感激。 更新201606

  • 我有一个数据库: 当用户()在应用程序中注册时,他会填充另一个用户uid(该用户uid具有属性)并将自己的uid添加到他的个人资料中(

  • 如果我在公共模式下使用Firebase实时数据库发布我的Android应用程序会怎么样,因为我不需要任何身份验证。它说 公共访问使您的数据库对任何人开放,即使是不使用您的应用的人,因此请务必在设置身份验证时再次限制您的数据库。 我不清楚,如果他们的应用程序没有连接到我的数据库,而且他们也没有firebase帐户的登录密码,那么他们怎么能访问我的数据库。 提前发送Thx

  • 我正在尝试为我的Firebase实时数据库设置规则,但我不明白为什么它们不起作用。下面是数据顶部的样子: 假设我希望允许用户读取其用户名与数据中的name字段匹配的数据。我以为这样的事情会奏效 不幸的是,这对我不起作用。为了学习,我甚至试过这个 或者甚至 这到底是怎么回事