具有安全规则的Firestore事务处理读取

时间:2018-01-22 16:50:39

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

我想创建两个文档

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对应的客户文档。两个文件应该一起创建。我一直在尝试使用事务执行此操作但我不断收到错误“事务失败所有重试。”。什么是错的,我该如何解决?

2 个答案:

答案 0 :(得分:0)

数据变量是一个对象而不是数组,因此您应该使用data.consumerId而不是data['consumerId']

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

答案 1 :(得分:0)

我最终通过批处理写入和安全规则来完成此操作。

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' }
);