如何在Firestore规则中使用数组进行验证

时间:2019-08-22 19:15:01

标签: firebase firebase-realtime-database firebase-security

在Firestore中,我有一个存储多个对象的集合,这些对象由多个用户共享。 例如:

{
  users: [uid1, uid2, uid3],
  content: 'sample'
}

这三个用户都应该能够看到该文档。为此,我创建了以下规则:

service cloud.firestore {
  match /databases/{database}/documents {

    match /sharedDocs/{doc} {
      allow read: if isMember(doc);
      allow update: if isMember(doc);
    }

    function isMember(doc) {
      return doc.indexOf(request.auth.uid) != -1;
    }
  }
}

我通过Angular(AngularFirestore模块)发送查询:

return this.db.collection('sharedDocs,
  ref => ref.where('users', 'array-contains', uid)
).valueChanges();

不幸的是,此查询出现以下错误:

  

ERROR FirebaseError:缺少权限或权限不足。

1 个答案:

答案 0 :(得分:0)

您可以编写一个安全规则,在其中可以使用数组进行验证。您可以使用in条件来检查数组中是否存在特定值。

请考虑一个示例,其中需要限制使用现有的uniqueId创建新文档,即,如果用户已经使用相同的uniqueId创建了文档,并且其uniqueId存在于{{ 1}}在其用户文档的createdDocs集合中。

Users

针对您的特定情况尝试以下操作:

service cloud.firestore {
  match /databases/{database}/documents {
    match /Docs/{uniqueId}{
      //Only restricting new docs 
      allow create: if  (! uniqueId in getUserData(request.resource.data.userId).createdDocs); 
    }       

    //Function to get the user information
    function getUserData(userId){
      return get(/databases/$(database)/documents/Users/$(userId)).data;
    }             
  }
}

注意:请确保您在应用程序中进行了相同的检查,因为已知Firestore安全规则模拟器存在一些问题。

希望这会有所帮助。