firebase - 用户读取自己的个人资料数据时如何为读取操作设置 Firebase 安全规则
问题描述
我正在开发一个 Flutter 应用程序并使用 Firebase 作为后端。在我的应用程序中,每个用户都需要注册才能使用该应用程序,并且用户的个人资料数据保存在一个user_profile
集合中。
每个用户的配置文件数据都存储在集合中的单独文档中。每个文档的文档 ID 等于用户 ID,由 Firebase 身份验证在用户首次注册时创建。我还将用户 ID 保存在每个文档的一个字段(名为 uid)中,以及相应的用户。
对于安全部分,我希望每个用户只能阅读他/她自己的个人资料数据。我设置了以下规则:
// Rules for User Profile data
match /user_profile/{any} {
allow read: if (request.auth != null) &&
(resource.data.uid == request.auth.uid) &&
exists(/databases/$(database)/documents/users/$(request.auth.uid));
如果我按照上面的例子设置我的规则是否正确?(1) 用户需要认证 (2)uid
传入请求中的 uid 需要等于用户要阅读的相应文档中的 uid 字段。(3)请求中可用的uid的文档必须存在于对应的文档中
如果我让整个事情变得不必要地复杂,我无法让我清楚。例如,规则 (1) 是否与规则 (2) 做同样的事情?虽然我有规则 (1) 和 (2),但它是否也增加了规则 (3) 的内容?
解决方案
基于您问题中的以下要素:
- 用户的个人资料数据保存在
user_profile
集合中 - 每个(用户的配置文件)文档的文档 ID 等于用户 ID
- 您希望每个用户只能阅读他/她自己的个人资料数据
以下读取安全规则应该可以解决问题:
service cloud.firestore {
match /databases/{database}/documents {
// Match any document in the 'user_profile' collection
match /user_profile/{userId} {
allow read: if request.auth != null && request.auth.uid == userId;
// ...
}
}
}
换句话说,由于每个(用户的配置文件)文档的文档 ID 等于userId
您不需要userId
在安全规则中使用包含 的字段:通配符表达式{userId}
使userId
变量在规则中可用,请参阅doc。
推荐阅读
- arrays - 使用在 C 中接收字符串的方法
- java - 在 Date Java 中设置时区
- python - 当我在控制台之外执行时,Python 脚本执行目录发生了变化
- flutter - myfatoorah_flutter 导入包构建失败
- docker - 使用 Docker for Windows 启动 SMB 容器
- angular - 使用 ng-multiselect-dropdown 过滤并仅显示以输入字符开头的选项
- google-sheets - 计算谷歌表格中由“-”分隔的单元格范围内的单词数
- c# - 如何在 Parallel.ForEach 中应用异步
- python - office365 sharepoint open binary 给出缺少架构错误
- javascript - 为什么digest 和digest('hex') 会导致不同的输出?