Firebase 规则 - 共享用户合同和用户特定合同

Firebase Rules - Shared User Contracts and User Specific Contracts

我正在开发承包商和雇主之间的承包应用程序。我现在正在处理合同本身。

我从创建消息传递应用程序和游戏(例如 Happy-Angry-Surprised 示例 firebase 应用程序)的角度考虑了这一点。

我现在有一个合约节点/contracts/。一个合约中只能有 2 个用户。很像 2 个人在玩游戏或聊天。

/contracts/contractKey/employerID
/contracts/contractKey/contractorID
/contracts/contractKey/metadata

承包商和雇主有一个单独的仪表板。我希望能够向每种类型的用户展示他们的特定合同。

我有一个 /users/ 节点,混合了两种类型的用户,但每个人都有一个角色 /users/role

我在考虑/users/uid/contracts/contractKey:true

这是实际的 problem/question:

我会在创建合同时将这些连接写给每个用户。但是,雇主在登录时总是 initiates/creates 合同。为了编写连接,我必须让他们写入 /users/uid 节点,该节点将包含一个是他们的节点,一个是没有。

这是为了能够添加这个数据:/users/uid/contracts/contractKey:true.

我怎样才能更好地构建它或编写写入规则以防止让雇主访问所有承包商数据?

好吧,我开始使用 Firebase Cloud Functions,顺便说一句,这太棒了!处理此问题的最佳方法是在服务器端,这样我可以在客户端确保数据更安全。

这是我想出的:

exports.fanContract = functions.database.ref('/contracts/{contract_id}/')
.onWrite(event => {
  // Grab the current value of what was written to the Realtime Database.
  const original = event.data.val();
  const contractorID = original.contractorID;

  console.log('moving', event.params, original);

  // You must return a Promise when performing asynchronous tasks inside a Functions such as
  // writing to the Firebase Realtime Database.

  return admin.database().ref(`/users/${contractorID}/contracts/${event.params.contract_id}`).set(original);
});

这是它的工作原理。每当数据库上发生写入事件到 /contracts/contract_id 节点时,都会触发一个运行 firebase 函数的事件 "fanContract."

它会抓取写入的数据和合约中的contractID。然后我们可以使用 Admin SDK 来引用将数据复制到的位置。我们可以使用承包商 ID 和事件参数来获取合同 ID。这样我就可以将每个用户的合同整齐地存储在他们的用户信息下。

当我需要向用户提供他们的合同信息时,这将使工作变得更轻松。下一步是能够更新合约并保持并发。