【问题标题】:Firestore transactions with security rules making reads具有安全规则的 Firestore 事务进行读取
【发布时间】:2018-01-22 16:50:38
【问题描述】:

我想创建两个文档

Account/{uid} {
    consumerId: ... //client generated id
}

Consumer/{consumerId} {
    ...
}

我有一个消费者集合的安全规则

match /Consumer/{consumerId} {
    allow create: if (consumerId == get(/databases/$(database)/documents/Account/$(request.auth.uid)).data['consumerId'];
}

我需要确保一个帐户只能添加一个带有consumerId 的消费者文档,该consumerId 对应于其帐户文档中的那个。两个文档应该一起创建。我一直在尝试对事务执行此操作,但我不断收到错误“事务所有重试失败。”。出了什么问题,我该如何解决?

【问题讨论】:

  • 你得到答案了吗?
  • @AKnox 很遗憾没有

标签: firebase firebase-security google-cloud-firestore


【解决方案1】:

数据变量是一个对象而不是一个数组,所以你应该使用data.consumerId而不是data['consumerId']

match /Consumer/{consumerId} {
    allow create: if consumerId == get(/databases/$(database)/documents/Account/$(request.auth.uid)).data.consumerId;
}

【讨论】:

  • 感谢您的回复。文档说明您可以通过任何一种方式访问​​索引。 firebase.google.com/docs/firestore/reference/security(在“索引”下)。问题似乎是 Account 集合不包含该文档,即使它是在我的事务中的 Consumer 文档之前编写的。你知道这是为什么吗?
【解决方案2】:

我最终通过批量写入和安全规则完成了这项工作。

match /consumer/{cid} {
  function isNewResource() { return resource == null; }

  allow create: if isRegistered();
  allow read, update: if isNewResource();
}

然后是客户端,类似于

createThing() {
  const db = firebase.firestore();
  const { uid, displayName } = this.auth.currentUser;
  const batch = this.db.batch();

  // Essentially generating a uuid
  const newConsumerRef = db.collection("consumer").doc();

  // Update the user doc
  batch.update(
    db.collection('/users').doc(uid),
    { consumerID: newConsuemrRef.id }
  );

  // Update the admins field in the new doc
  batch.set(newConsumerRef, {
    admins: {
      [uid]: displayName,
    },
  });
  return batch.commit();
}

我的问题是一样的,但是写入集合中的字段实际上需要一个对象键,所以看起来有点时髦

batch.update(
    db.collection('/users').doc(uid), 
    { [`adminOf.${newRef.id}`]: 'some special name' }
);

【讨论】:

    猜你喜欢
    • 2021-12-11
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2019-07-05
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多