【发布时间】:2019-04-17 12:27:52
【问题描述】:
我在我的 Android 项目中使用 firebase,我在 Cloud Firestore 数据库中有一个用户集合,用户只能更新一些字段,但可以读取所有字段,我知道无法保护文档的子集免受正在更新,并且安全规则只能应用于整个文档,所以我搜索了这个,我发现的唯一解决方案是在用户文档中创建一个子集合并在这个子集合中创建一个新文档,最后放我想在那里保护的字段,然后我可以在安全规则部分应用此代码轻松保护此文档:
match /users/{userId}/securedData/{securedData} {
allow write: if false;
allow read: if true;
}
所以现在这些字段没有人可以写,但是任何人都可以读,这正是我想要的,但是后来我发现我需要根据子集合内部的字段来查询用户,也就是所谓的集合目前不支持组查询,所以我最终得到了两个解决方案:
- 检索所有用户并在客户端过滤它们,但这会增加文档读取的数量,因为我正在查询所有用户集合文档+为每个用户读取的额外子集合文档以获得所需的字段过滤用户。
-
不要在用户文档中创建子集合并引发这些问题,只需将所有字段保留在顶级文档(用户文档)中,允许用户更新任何字段。
match /users/{userId} { allow update, read: if true; allow create, remove: if false; }但是制作一个(onUpdate)云函数来监听用户文档更新和 检测不允许用户修改的字段的变化,所以 如果用户尝试更改这些字段,我可以检测到这一点并将修改后的字段返回到他们以前的值,如下所示:
export const updateUser = functions.firestore .document('users/{userId}') .onUpdate((change, context) => { const previousValue = change.before.data().securedField; const newValue = change.after.data().securedField; if (previousValue !== newValue) { return db.collection('users') .doc(context.params.userId) .update({ securedField: previousValue }); } });
第二种解决方案安全吗?哪个是最好的解决方案?或任何其他解决方案?
【问题讨论】:
标签: firebase google-cloud-firestore google-cloud-functions firebase-security