我正在尝试创建一个Firestore auth规则,该规则将当前用户与团队文档中的团队成员列表进行检查。成员被存储为文档参考,所以我一直在尝试这样的事情:
match /teams/{document=**} {
allow read: if path("/users/" + request.auth.uid) in resource.data.members;
}
但是,当我尝试访问团队文档时,我会被告知有一个验证失败。
每个团队成员在/users
中使用UID作为钥匙都有自己的文档。因此,用户可能是/users/12345678
,并且团队文档可能具有:
/teams/team1 {
members: [/users/12345678, ....]
}
成员是参考类型。
到目前为止有什么建议?
安全规则确实具有参考的概念,并且表示为路径类型对象。当通过安全规则读取文档参考时,您必须像对待路径一样对待它。这条路将完全有资格:
/databases/$(database)/documents/collection/documentId
$(数据库(来自您通常的顶级数据库通配符匹配。
因此,您的规则可能会这样实施:
match /teams/{document=**} {
allow read: if /databases/$(database)/documents/collection/users/$(request.auth.uid) in resource.data.members;
}
请注意,在安全规则中,您可以通过/
开始构建路径,然后使用$(foo(将变量作为路径组件进行插值。