Firebase Firestore访问规则 - 比较资源数据

时间:2018-04-23 12:34:48

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

存储在数据库中的模型如下:

{
    "ownerUid": <my auth UID>,
    "teamName: "Team 1",
    "teamDescription: "Team 1 desc"
}

我的初始访问规则是这样的:

service cloud.firestore {
    match /databases/{database}/documents {    
        match /teams/{teamId} {
            allow read: if resource.data.ownerUid == request.auth.uid;
            allow write: if true; //ignore this
        }
    }
}

我为获得团队而运行的查询如下:

Query query = FirebaseFirestore.getInstance()
              .collection("teams")
              .orderBy("teamName")

运行此查询将始终导致“PERMISSION DENIED”,我不确定其原因是什么。

出于测试目的,我也尝试了以下规则:

allow read: if true; //Works
allow read: if request.auth.uid != null; //Works
allow read: if request.auth.uid == <my auth uid>; //Works
allow read: if resource.data.ownerUid != null; //Fails

在成功的规则上,我可以在返回的团队中看到ownerUid,并看到它不是null,并且与之匹配。

1 个答案:

答案 0 :(得分:1)

在您当前的代码中,您尝试从集合teams中读取。由于您无法访问该完整集合,因此拒绝阅读。

如果您想让用户查询他们创建的文档,您需要做两件事:

  1. 使用仅检索他们创建的文档的查询。
  2. 编写安全规则,以便他们允许此查询。
  3. 你已经完成了#2,但没有做#1。要使工作正常,请使用如下查询:

    String uid = FirbaseAuth.getInstance().getCurrentUser().getUid();
    Query query = FirebaseFirestore.getInstance()
              .collection("teams")
              .whereEqualTo("ownerUid", uid)
              .orderBy("teamName")
    

    另请参阅Secure and query documents based on auth.uid上的文档部分。