当数据不存在时,Firestore会对其进行规则

时间:2017-10-14 21:51:53

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

我尝试创建的规则只允许用户创建/编辑request.auth.uid与他们尝试创建的文档名称相匹配的文档。来自https://cloud.google.com/firestore/docs/security/secure-data

  

使用来自通配符的变量

     

使用带有通配符的数据库路径匹配规则时,a   使用与您包含的字符串匹配的名称创建变量   在大括号内。然后,您可以在中引用这些变量   你的安全规则。

     

这些类型的通配符的一个常见用途是存储文档   userID,然后只允许用户访问他们的文档   userID匹配文档的ID。

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userIDFromWildcard}/ {
      // Users can only edit documents in the database if the documentID is
      // equal to their userID
      allow read, write: if request.auth.uid == userIDFromWildcard;
    }
  }
}

我尝试在我的规则中使用此代码,但它出错了。删除最后一个/,即match /users/{userIDFromWildcard}而不是match /users/{userIDFromWildcard}/时,会发布,但如果文档不存在,则不会授予权限。

编辑:我也试过这样的事情,但由于缺乏文档,我不知道如何正确地做到这一点:

allow read, write: if request.auth.uid == request.resource.__name__;

这是我正在运行的代码insufficient permissions

this.items = afs.doc("/users/" + this.uid); // afs is AngularFirestore, this.uid is the uid of the authenticated user

...

// the user is authenticated at this point
this.items.snapshotChanges().subscribe(snapshot => {
if (!snapshot.payload.exists) { // if user isn't in db
    function recursive() {
        // ...
        this.updateDB(); // called once because of conditional
    }
    recursive();
    } else {
        // ...
    }
}

updateDB

public updateDatabase(): void {
    const changes: Item = { name: this.name, username: this.username, 
    photoURL: this.photoURL };
    this.items.set(changes).then((item) => { // causes error
        console.log("Saving successful");
    }, (err) => {
        console.log(err);
    }).catch((err) => {
        console.log(err);
    });
}

1 个答案:

答案 0 :(得分:0)

您可能需要此文档设置:

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

此外,如果您需要写入子集,请参阅this answer

有关firestore here

中的通配符匹配的更多信息