firebase - 安全规则:在一个文档中存储唯一的用户名
问题描述
在我的应用程序上,我试图让用户必须拥有一个唯一的用户名。
我目前的方法是拥有一个Social
包含一个名为Usernames
. 该文档将用户存储userID
为字段的键,然后将用户存储username
为值。
我正在努力为此编写正确的安全规则。我希望这样:
- 所有登录用户均可获取此文档
- 用户只能更新文档中自己的数据,格式为[theirUserId: theirUsername]
- 不能有重复的用户名,例如
- 用户 IDA:“foo”
- 用户IDB:“foo”
目前,我无法开始工作的唯一一点是检查用户名是否已被使用。
我想到的另一个解决方案是反转字段(用户名:userID)。但我也想不出如何为这种方法编写安全规则。
当前规则
// Usernames
match /Social/Usernames {
allow get: if request.auth.uid != null;
allow update: if isUserNameAvailable();
}
// Functions
function isUserNameAvailable() {
// This line works
return (request.writeFields.hasOnly([request.auth.uid]))
// This one doesn't
&& !(resource.data.values().hasAny([request.writeFields[request.auth.uid]]));
}
Firestore 数据结构
非常感谢任何帮助,非常感谢!
解决方案
推荐阅读
- huawei-mobile-services - 运行HMS地图应用程序时如何解决捆绑信息:错误代码:4?
- node.js - 发布失败时触发发布后脚本
- javascript - 如何解决这个错误?xhr.js:178 获取 https://www.googleapis.com/youtube/v3/search?q=Tesla 403
- c++ - 编译 gsl 库。出现错误:zsh: exec format error: ./compute.o
- stm32 - Stm32F4 ADC 模拟看门狗中断不起作用
- kubernetes - HPA 在 k8s 中显示未知
- r - 增加 ggplot 比例的默认中断数
- laravel - Laravel lighthouse Sanctum 基于角色的代币、最佳实践和安全性
- javascript - 如何在间隔结束之前结束/清除/终止在间隔之后开始的函数?
- java - 如何处理这个具体的服务器/客户端模型中的 ConnectException?(爪哇)