Anu*_*hav 12 google-cloud-firestore firebase-security-rules
在firestore中,如果用户teamid在文档中提到的那样,我希望用户只访问文档.现在我有一个不同的集合teams,我将用户映射为{ user_id = true }.所以我在Firestore规则中有以下内容
return get(/databases/$(database)/documents/teams/$(resource.data.teamid)).data.approvedMembers[request.auth.uid] == true;
Run Code Online (Sandbox Code Playgroud)
现在,此规则不起作用,并且未能通过前端向数据库发出任何请求.但当我$(resource.data.teamid)用我的实际teamid值替换如下,
return get(/databases/$(database)/documents/teams/234234jk2jk34j23).data.approvedMembers[request.auth.uid] == true;
Run Code Online (Sandbox Code Playgroud)
......它按预期工作.
现在我的问题是我resource是以错误的方式使用resource,get()还是exists()在Firestore规则中不支持或查询?
编辑 完整规则如下
service cloud.firestore {
match /databases/{database}/documents {
function isTeamMember() {
return get(/databases/$(database)/documents/teams/$(resource.data.teamid)).data.approvedMembers[request.auth.uid] == true;
// return exists(/databases/$(database)/documents/teams/$(resource.data.teamid));
}
match /{document=**} {
allow read, write: if isTeamMember();
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您注意到注释掉的规则,exists()则在这种情况下也不起作用.
你有这个match:
match /{document=**} {
allow read, write: if isTeamMember();
}
Run Code Online (Sandbox Code Playgroud)
这将匹配数据库中的任何文档。这意味着当您调用时isTeamMember(),不能保证它resource代表一个team文档。如果您有任何子集合teams并写入这些子集合,那么resource将是子集合文档。
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |