firebase - Firebase 实时数据库添加基于子节点的规则
问题描述
我已将规则设置为
(root.child('users').child(auth.uid).child('role/cafe').val() === true)
在我的实时数据库规则中。
我的用户是
key {
uid: xxxx
name: xxxx
role:{
cafe: true
user: false
}
}
如果 auth.uid 等于 key,则该规则有效,但是如何修改上述规则以在数据中查找 uid
解决方案
目前尚不清楚$key
预期的价值是多少。所以我假设它只是一些没有在规则中使用的随机字符串。
对于每个安全规则,可以使用预定义的变量 访问节点的当前数据data
。".write"
和".validate"
规则也可以访问要写入的数据,如newData
. 这些都是RuleDataSnapshot对象。
假设进行更改的用户必须是uid
属性给定的用户,可以使用以下规则。
"rules": {
"users": {
"$key": {
".read": "auth != null && data.child('uid').val() == auth.uid",
".write": "auth != null && ((data.exists() && data.child('uid').val() == auth.uid) || (!data.exists() && newData.child('uid').val() == auth.uid)"
}
}
}
上述规则使用快速失败的方法。如果用户未登录,则检查中止。否则,用户的 ID 将与给定节点上的现有数据相匹配。如果数据尚不存在,则新更新的数据还必须与当前用户的 ID 匹配。
如果“cafe”角色很重要,以下规则还要求将“cafe”设置true
为允许读/写操作。
"rules": {
"users": {
"$key": {
".read": "auth != null && data.child('uid').val() == auth.uid && data.child('role/cafe').val() == true",
".write": "auth != null && ((data.exists() && data.child('uid').val() == auth.uid && data.child('role/cafe').val() == true) || (!data.exists() && newData.child('uid').val() == auth.uid && newData.child('role/cafe') == true))"
}
}
}
注意:如果$key
要存储用户信息/数据,我强烈建议使用用户 ID 作为密钥,因为安全规则无法执行诸如“用户 ID 是否具有管理员角色?”之类的查询。无需结构化您的数据以允许它。如果$key
是用户名,请改为使用用户名到用户 ID 映射,因为它可以防止将来出现问题。一个这样的例子是,如果用户想要更改他们的用户名,您可以删除新用户名并将其链接到用户,而无需移动他们的所有数据。
推荐阅读
- node.js - 为什么我收到错误,因为不允许使用 nodejs 将文件从一个文件夹复制到另一个文件夹?
- arrays - 如何在 glsl 中实现任意大小的向量
- ssl - 如何强制或重定向我的 next.js 网站以使用 https
- .net - 如何使用 .Net SDK 从恢复服务库生成安全 PIN?
- kubernetes - Openshift:CI/CD 访问来自不同集群的镜像流
- for-loop - Findstr 在 UNC 批处理脚本上太慢了
- python - 如何在 python 中设置 powershell 的环境
- android - Android Cloud Firestore 从集合中获取少量文档的有效方法
- c# - 无需安装任何东西即可读取/写入 Excel 文件
- firebase - 如何使用 FCM 后台通知更新 UI?