Firestore安全规则,get()和allow create操作

时间:2018-06-27 14:13:26

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

我制作了一个应用程序,用户可以在其中将记录发布到Firestore数据库中。现在,我正在实施安全规则,但是我正在努力寻找解决方案。

我的代码如下

docRef.get().then(function(doc){
            if(doc.exists){
                docRef.set(//data to set here)
            } else {
                docRef.update(//data to update here)
            }
            .catch((error) => {
              alert('Error' + error);
            })
 

我的规则当前设置为允许用户在获得授权的情况下创建对象,并且仅当记录中的用户ID与自己匹配时才允许更新。

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{user}{
    	allow create: if request.auth.uid != null;
			allow read, write: if request.auth.uid == resource.id;    
    }
    match /equipment/{document} {
    	allow create: if request.auth.uid != null;
      allow read, update: if request.auth.uid == resource.data.user;
    }

我认为问题出在我试图创建对象之前。但是,我需要在写入文档之前执行这些检查。 我认为这个问题正确吗?如果有的话,我可以实施一个解决方案。

谢谢

2 个答案:

答案 0 :(得分:0)

我仍在制定规则,但我希望这会有所帮助。

如果您要确保用户正在编辑自己拥有的内容,并且他们的uiddocument id相同。...

function isOwner(userId) {
  return request.auth.uid == userId
}
match /users/{userId} { //this is the document 
    allow write: if isOwner(userId);
}

如果您要确保他们是文档的创建者:

match /equipment/{documentId} {
   allow create: if request.auth.uid != null;
   allow read, update: if get(/databases/$(database)/documents/equipment/documentId).data.userId == request.auth.uid;
}

https://firebase.google.com/docs/firestore/security/rules-conditions?authuser=0

您需要使用get函数来检索您感兴趣的文档。该函数返回的数据具有可以比较的相关字段,在这种情况下,无论您存储用户ID的字段名称是什么,您都可以将其与他们的auth.uid进行比较。

答案 1 :(得分:0)

我认为您应该将“创建”规则更改如下:

allow create: if request.auth.uid != null &&
                 request.auth.uid == request.resource.data.id;

这是文档所说的:“如果您的规则集允许挂起写入,request.resource 变量包含文档的未来状态。”