bas*_*sil 7 firebase firebase-security google-cloud-firestore
我正在尝试保护对集合的请求以允许任何单个get,但仅在list匹配特定密钥时才允许。
数据库结构是这样的:
projects
project1
name: "Project 1 name"
board_id: "board1"
project2
name: "Project 2 name"
board_id: "board2"
boards
board1
board2
Run Code Online (Sandbox Code Playgroud)
我从 Vue 进行的 Firestore 查询:
// Only return projects matching the requested board_id
db
.collection("projects")
.where("board_id", "==", this.board_id)
Run Code Online (Sandbox Code Playgroud)
我想要的安全规则是这样的:
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
Run Code Online (Sandbox Code Playgroud)
我想这样做,以便您可以列出特定板中的项目,但不能只列出所有内容。
有没有办法访问.where()安全规则中的请求,或者我是否需要将我的projects收藏嵌套在我的boards收藏中并以这种方式保护它?
这实际上取决于您将来想要如何查询数据。如果您不需要列出所有项目(无论板),那么您当前的数据模型更好,并且可以通过将允许的板作为地图{board_id: true}或(理想情况下)子集合添加到 /users 文档来确保安全。
/projects/{project_id}
/boards/{board_id}
/users/{uid}/boardPermissions/{board_id}
Run Code Online (Sandbox Code Playgroud)
match /projects/{project} {
allow list: if exists(/databases/$(database)/documents/users/$(request.auth.uid)/boardPermissions/${resource.data.board_id})
Run Code Online (Sandbox Code Playgroud)
如果您想完全分区数据(这是我在许多项目中倾向于做的事情),那么创建以下模型
/boards/{board_id}/projects/{project_id}
/users/{uid}/boardPermissions/{board_id}
Run Code Online (Sandbox Code Playgroud)
match /boards/{board_id}/projects/{project_id} {
allow list: if exists(/databases/$(database)/documents/users/$(request.auth.uid)/boardPermissions/${board_id})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1803 次 |
| 最近记录: |