我试图保护对集合的请求以允许任何单个get
,但仅在匹配特定键的情况下才允许list
。
数据库结构是这样的:
projects
project1
name: "Project 1 name"
board_id: "board1"
project2
name: "Project 2 name"
board_id: "board2"
boards
board1
board2
我从Vue进行的Firestore查询:
// Only return projects matching the requested board_id
db
.collection("projects")
.where("board_id", "==", this.board_id)
我想要的安全规则如下所示:
match /projects/{project} {
allow get: if true // this works
allow list: if resource.data.board_id == [** the board_id in the query **]
// OR
allow list: if [** the board_id in the query **] != null
我想这样做,以便您可以在特定板中列出项目,但不能仅列出所有内容。
是否可以在安全规则中访问请求的
.where()
,还是需要将projects
集合嵌套在boards
集合中并以这种方式保护它? 最佳答案
这实际上取决于您将来如何查询数据。如果您不需要列出所有项目(与开发板无关),那么您当前的数据模型会更好,并且可以通过将允许的开发板作为 map {board_id: true}
或(理想情况下)子集合添加到/users文档中来进行保护。 。
当前数据模型
数据库
/projects/{project_id}
/boards/{board_id}
/users/{uid}/boardPermissions/{board_id}
安全规则
match /projects/{project} {
allow list: if exists(/databases/$(database)/documents/users/$(request.auth.uid)/boardPermissions/${resource.data.board_id})
替代数据模型
如果您想对数据进行完全分区(这是我在许多项目中经常要做的事情),请创建以下模型
数据库
/boards/{board_id}/projects/{project_id}
/users/{uid}/boardPermissions/{board_id}
安全规则
match /boards/{board_id}/projects/{project_id} {
allow list: if exists(/databases/$(database)/documents/users/$(request.auth.uid)/boardPermissions/${board_id})
关于firebase - 基于请求查询值的Firestore安全规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48961574/