Jul*_*ten 1 firebase-security angular google-cloud-firestore
我的项目中有以下情况。我正在使用 Angular Firestore 来获取用户详细信息的组集合。
我的数据库集合层次结构如下所示。
users/{userId}/personalInfo/{document}
Run Code Online (Sandbox Code Playgroud)
我在Firestore 中为personalInfo 创建了一个组索引。
当我将规则重置为默认值(例如放置)时
match /{document=**} {
allow read, write: if false;
}
Run Code Online (Sandbox Code Playgroud)
在我的规则结束时,它起作用了,我能够查询每个个人信息文档。
但是,一旦我尝试设置任何规则来保护此 groupCollection,我就会收到此“权限被拒绝”消息。
我尝试在规则底部设置的最简单的规则如下所示。
match /users/{userId=**}/personalInfo/{doc} {
allow read, write: if true;
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,我收到此权限被拒绝的消息,但不知道为什么。
在我的 UserService 中,我使用 Angular Firestore 来简单地执行 collectionGroup 查询。
constructor(private afs: AngularFirestore) {}
public getUsersDetailedInfo() {
return this.afs.collectionGroup('personalInfo');
}
Run Code Online (Sandbox Code Playgroud)
您可能需要查看有关集合组查询的安全规则的文档。它说:
在安全规则中,您必须通过为集合组编写规则来明确允许集合组查询:
- 确保
rules_version = '2';是规则集的第一行。集合组查询需要安全规则版本 2 的新递归通配符 {name=**} 行为。- 使用 为您的收集组编写规则
match /{path=**}/[COLLECTION_ID]/{doc}。
不能在集合组路径段前面使用静态路径段。这成为集合组查询始终尝试考虑具有给定名称的所有集合。您不能将查询或规则限制为仅嵌套在“用户”下的那些子集合。
如果您想允许所有集合组查询“personalInfo”,则必须如下所示:
match /{path=**}/personalInfo/{doc} {
allow read, write: if true;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我在这里所做的只是从匹配中删除“用户”路径段。