Firestore规则,强制用户编写id等于其自己的uid的文档

时间:2018-04-01 23:45:50

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

我想保证用户只能添加与其auth.uid具有相同ID的文档。

例如,ID为1X0T6xC6hhRN5H02zLCN6SQtwby2的用户只能创建/更新文档/ salesmen / 1X0T6xC6hhRN5H02zLCN6SQtwby2。

在应用级别,它由以下命令完成(包括创建和更新)。

 this.db
    .collection("salesmen")
    .doc(user.uid)
    .set(data)
    .then(function() { //...

在Firestore级别,我正在尝试以下规则,但它无法正常工作(导致错误编写文档:错误:权限丢失或不足。)。

match /salesmen/{salesman} {
  allow read: if true;
  allow write: if request.auth != null && resource.id == request.auth.uid;
}

如何执行此规则?

1 个答案:

答案 0 :(得分:5)

resource.id只能用于引用Firestore中的现有文档。如果正在编写的文档尚不存在,则它不起作用。

相反,您可以在匹配表达式中使用salesman通配符来确定用户是否可以编写特定文档,即使它尚不存在:

match /salesmen/{salesman} {
  allow read: if true;
  allow write: if request.auth != null && salesman == request.auth.uid;
}

看起来您也可以使用request.resource.id来引用可能尚未编写的文档的ID:

match /salesmen/{salesman} {
  allow read: if true;
  allow write: if request.auth != null && request.resource.id == request.auth.uid;
}

虽然我现在无法在reference documentation中找到明确讨论过的内容。