使用规则和身份验证对云Firestore数据库进行私有化

时间:2017-12-17 15:08:48

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

我正在为firebase编写云firestore的规则,我想限制使用用户访问数据库' auth id,但规则不符合我的预期。

所以,我的数据库结构是这样的:

/用户/ {用户id} /组/ {的groupId}

我希望只有用户才能使用自己的userId访问文档。

为实现这一目标,我编写了如下规则:

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

    match /users/{userId=**} {
        allow read: if userId == request.auth.uid;
    }

  }
}

但有了这个,我的用户无法阅读他们自己的"组"来自数据库。

我正在使用javascript和代码来检索" groups"如下:

console.log("uid: ", uid)
db.collection("users/" + uid + "/groups")
  .onSnapshot(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
      console.log(doc.data())
    })
})

既然cloud firestore没有像实时数据库这样的调试工具,我自己做了一些调试。

我有一个测试用户的uid为" 5lS2NA21UgbabEw4AkyWyef9FH42",所以我改变了这样的规则:

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

    match /users/{userId=**} {
        allow read: if "5lS2NA21UgbabEw4AkyWyef9FH42" == request.auth.uid;
    }

  }
}

有了这个,我的测试用户就能够成功检索"组"来自他的文件的数据(当然所有其他用户都可以,但是)。

现在我将规则改为:

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

    match /users/{userId=**} {
        allow read: if "5lS2NA21UgbabEw4AkyWyef9FH42" == userId;
    }

  }
}

现在我无法从数据库中获取任何数据。

有人能告诉我我做错了吗?

1 个答案:

答案 0 :(得分:0)

我想我已经弄明白了。问题是这个{userId = **}

如果您有以下规则

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

    match /users/{userId=**} {
        allow read: if userId == request.auth.uid;
    }

  }
}

并且正在尝试访问用户/ 5lS2NA21UgbabEw4AkyWyef9FH42 / groups," userId"变量不评估为5lS2NA21UgbabEw4AkyWyef9FH42(我不知道它会是什么,但我会猜测" 5lS2NA21UgbabEw4AkyWyef9FH42 / groups")。因此,如果要对文档进行私有化,则必须在规则中指定每个文档,如下所示。

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

    match /users/{userId} {
        match /groups/{groupId} {
           allow read: if userId == request.auth.uid;
        }
        match /events/{eventId} {
           allow read: if userId == request.auth.uid;
        }
    }

  }
}