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

leo*_*rdo 2 firebase firebase-authentication firebase-realtime-database google-cloud-firestore

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

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

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

 this.db
    .collection("salesmen")
    .doc(user.uid)
    .set(data)
    .then(function() { //...
Run Code Online (Sandbox Code Playgroud)

在Firestore级别,我正在尝试以下规则,但它不起作用(导致错误写入文档:错误:缺少权限或权限不足.).

match /salesmen/{salesman} {
  allow read: if true;
  allow write: if request.auth != null && resource.id == request.auth.uid;
}
Run Code Online (Sandbox Code Playgroud)

如何执行这条规则?

Dou*_*son 8

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

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

match /salesmen/{salesman} {
  allow read: if true;
  allow write: if request.auth != null && salesman == request.auth.uid;
}
Run Code Online (Sandbox Code Playgroud)

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

match /salesmen/{salesman} {
  allow read: if true;
  allow write: if request.auth != null && request.resource.id == request.auth.uid;
}
Run Code Online (Sandbox Code Playgroud)

虽然我现在无法在参考文档中找到明确讨论过的内容.