google-cloud-firestore - 更新“用户名”一次性规则
问题描述
我希望 Firestore 的规则仅在用户名从未更改时才检查为真......
FirebaseAuth:如果用户是新用户,一个函数会设置一个随机用户名。然后用户更改此随机用户名。现在我想要一个设置用户名“IMMUTABLE”的规则(只有一次)所以:我可以尝试在文档中使用布尔标志:“isUsernameChanged”吗?
对于每个文档,我都有一个规则“isOwner”,这没关系,但我希望他不能更改用户名字段两次,并且只能更改用户名字段两次,该文档还有其他字段,他可以随时更新。
我不想(我不会)改变结构,也许是一个新的子集合更好......?或者也许'isUsernameChanged'也必须进入一个新的(子)集合?
格拉齐
解决方案
这是我的解决方案
function isUsernameCambiabile(){
return (request.resource.data.username == resource.data.username || !getIfUsernameIsChanged() )
}
function getIfUsernameIsChanged(){
return exists(/databases/$(database)/documents/users/$(request.auth.uid)/isUsernameChanged/$(request.auth.uid))
}
match /users/{idUser} {
...
allow update: if (isOwner(idUser) && isUsernameCambiabile())
match /isUsernameChanged/{idUser} {
allow read: if isOwner(idUser) || isSuperAdmin();
allow create: if isOwner(idUser) || isSuperAdmin();
allow update: if false;
allow delete: if false;
}
}
当用户第一次更新他的用户名时...批量在 isUsernameChanged 子集合上设置具有相同 uid 的文档,像标志一样的子集合!?
我可以做得更好吗?谢谢
推荐阅读
- javascript - 在 useEffect 运行后删除事件侦听器导致 scrollIntoView() 永远不会关闭?
- javascript - “TypeError:曲线不是函数。(在'curve(buffer = path())'中,'curve'未定义)”在d3.js.v4中
- javascript - OAuth2 和 angular-auth2-oidc 库的问题 - PKCE 代码流
- c++ - 在 BST 中插入一个具有全局根的节点
- python - 如何从 DataFrame 创建 HTML 表格
- json - Oracle 将所有键/值转换为行
- python - 如何导出变量形式 __init__ 并在其他函数中使用
- c++ - 将线程重定向到另一个函数
- electron - 窗口没有收到来自 IpcRenderer 的消息
- javascript - 如何及时添加前导零?