google-cloud-firestore - Firebase 安全规则,确保只有一个“数组删除”,并且只对 userId
问题描述
我有通知记录,其中有文本和用户列表(最多 10 个)。
{text: "Beware of the dog", users: [ uid1, uid2, uid3, ... ]}
当用户阅读/确认通知时,我想将他从可以看到通知的用户列表中删除(然后他将不再收到任何通知)。
为此,当用户按下“隐藏通知按钮”时,他会发送更新通知记录的请求:
users: FieldValue.arrayRemove(uid)
我想使用用户的安全规则:
- 不更改通知记录的其他部分。
- 在 arrayRemove 部分发送它的 uid 和仅它的 uid。
试过了
allow update: if
request.auth.uid != null
&& request.auth.uid in resource.data.users
&& request.resource.size() == 1
&& request.resource.data.users != null;
- request.resource.size == 1 不起作用。无法弄清楚为什么,因为我的请求中只有一个字段。
- 我无法确保 arrayRemove 严格限制为它的 uid。
任何提示,帮助,想法都非常感谢。
解决方案
我有类似的情况,这是一个相当脑筋急转弯。这就是我的诀窍:
allow update: if
request.auth.uid != null
&& request.resource.data.diff(resource.data).affectedKeys().hasOnly([data])
&& request.resource.data.users.size() == resource.data.users.size() - 1
&& resource.data.users.removeAll(request.resource.data.users)[0] == request.auth.uid
具体来说:
- 第一条规则是您拥有的规则 - 检查用户身份验证
- 第二条规则检查新旧文档之间的差异,并确保唯一受影响的键是名为
data
- 第三条规则确保新数组比旧数组短 1 项(因此一次只能删除 1 项)
- 第四条规则从旧数组中减去新数组(现在减 1
uid
)removeAll()
并返回一个数组及其差值。在这种情况下,它返回一个数组,其中仅包含uid
您选择的单曲arrayRemove()
。然后我们简单地检查uid
- 它只能存在于位置[0]
- 并确保它等于uid
经过身份验证的用户。
推荐阅读
- office-js - Outlook 客户端加载项:链接和 JS 重定向到其他域,打开新的浏览器选项卡
- mysql - iReport中的员工考勤日历报表设计
- wordpress - 我可以使用固定布局创建自定义 Woocommerce 结帐吗
- javascript - React axios 对 Django 后端的请求为空
- python - 如何在手写文本识别中对数字和单词进行分类
- typescript - 使用远程 couchdb 删除,未触发相应的 pouchDB 更改事件
- python - Python 中特定于操作系统的命名空间规则
- node.js - 在 lambda nodejs 中创建密码 pdf 文件
- android - 在android中获取时间戳的最佳方法?
- python-3.x - 在 PyTorch 中使用反向传播和梯度下降查找参数