首页 > 解决方案 > 更新“用户名”一次性规则

问题描述

我希望 Firestore 的规则仅在用户名从未更改时才检查为真......

FirebaseAuth:如果用户是新用户,一个函数会设置一个随机用户名。然后用户更改此随机用户名。现在我想要一个设置用户名“IMMUTABLE”的规则(只有一次)所以:我可以尝试在文档中使用布尔标志:“isUsernameChanged”吗?

对于每个文档,我都有一个规则“isOwner”,这没关系,但我希望他不能更改用户名字段两次,并且只能更改用户名字段两次,该文档还有其他字段,他可以随时更新。

我不想(我不会)改变结构,也许是一个新的子集合更好......?或者也许'isUsernameChanged'也必须进入一个新的(子)集合?

格拉齐

标签: google-cloud-firestorefirebase-security

解决方案


这是我的解决方案

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 的文档,像标志一样的子集合!?

我可以做得更好吗?谢谢


推荐阅读