如何设置规则,以便可以将文档写入受uid保护的firestore?

时间:2018-10-08 06:17:35

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

我想这样做,这样我就可以让经过身份验证的用户写入仅对该用户可读/写/可创建的集合。我正在使用最基本的Firestore设置。我的Firestore规则如下所示:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{userId} {
      allow read, write, create: if request.auth.uid == userId;
    }
  }
}

我假设这将阻止对数据库的读取/写入/创建,除非路径的初始部分与登录用户的UID匹配。

我的JavaScript代码如下:

function addSomeData(data) {
    console.log( "Sending data with: ", user.uid, data );
    db.collection(user.uid).add({ data })
        .then(function(docRef) {
            console.log("Document written with ID: ", docRef.id);
        })
        .catch(function(error) {
            console.error("Error adding document: ", error);
        });
}

成功登录后,我肯定已正确设置了user.id。

以这种方式使用东西总是会在控制台中给我这个错误:

  

添加文档时出错:错误:缺少权限或权限不足。

如果我恢复到这样的原始规则,则说明文档已成功创建:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write;
    }
  }
}

我想做的是让每个集合都以登录用户的UID开头。因此,数据的样本形状可能是这样的:

/ax323/brty/data="Hello"
/ax323/98da/data="Goodbye"
/br981/ha31/data="No comment"

因此,ax323是Firebase中的UID,br981也是如此。 ax323有两个文档集合,而br981有一个。

问题是数据的“形状”吗?

我真的不了解{document=**}在原始规则中的含义,以及我是否需要将身份验证规则转换为类似内容。

1 个答案:

答案 0 :(得分:2)

在数据库规则中,您使用了match /users/{userId} { 此规则仅适用于对该特定路径进行数学计算的文档。 因此,如果您的文档路径为/ax323/brty/data,则您的规则应类似于

service cloud.firestore {
  match /databases/{database}/documents {
    match /{userId}/{document=**} {
      allow read, write, create: if request.auth.uid == userId;
    }
  }
}

也看着您的问题,当您提到

时,我无法理解brty的含义。

/ax323/brty/data="Hello"吗?