一次更新“用户名”规则

时间:2019-05-07 17:44:25

标签: google-cloud-firestore firebase-security-rules

我希望只有当用户名从未更改时,firestore的规则才检查为真...

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

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

我不想(我不会)更改结构,也许最好是一个新的子集合...? 还是“ isUsernameChanged”也必须加入新的(子)集合?

grazie

1 个答案:

答案 0 :(得分:0)

这是我的解决方法

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

我可以做得更好吗?