Firebase 重新登录/额外登录会删除所有用户数据

Posted

技术标签:

【中文标题】Firebase 重新登录/额外登录会删除所有用户数据【英文标题】:Firebase re-login/additional login removes all user data 【发布时间】:2016-07-18 16:46:37 【问题描述】:

使用 Firebase android 文档保存数据列表:

String new_status;
new_status = status_update_text.getText().toString();
Firebase postRef = userRef.child("posts");
Map<String, String> post1 = new HashMap<String, String>();
post1.put("status", new_status);
postRef.push().setValue(post1);

身份验证后保存到数据库的用户:

//save user to database
Map<String, String> map = new HashMap<String, String>();
map.put("provider", authData.getProvider());
if(authData.getProviderData().containsKey("displayName")) 
    map.put("displayName", authData.getProviderData().get("displayName").toString());
   
   ref.child("users").child(authData.getUid()).setValue(map);

目前的安全规则:

"rules": 
    ".read": true,
      "$posts": 
      // create new post if it doesn't exist but can't modify or delete posts
      ".write": "!data.exists() || newData.exists()"
      

问题是当用户再次登录时,所有保存的数据都被 .setValue(map) 擦除(我假设)。我试图将写规则尽可能高,因为我已经阅读了级联规则,但我不明白为什么它目前被忽略???

【问题讨论】:

【参考方案1】:

你的条件不对:

!data.exists() || newData.exists()

假设您将数据写入已包含数据的位置。这评估为:

!true || true => true

您可能正在寻找:

!data.exists()

另见documentation on securing new data vs existing data。

【讨论】:

感谢您的意见@frankvanpuffelen。按照您的建议尝试,但现在它不允许任何写入?我最初在上面列出的尝试取自您提供的文档链接。请参阅标题为“匿名聊天示例”的最后一个标题。根据 cmets 第 34 行应该允许创建新消息但不允许修改或删除? !data.exists() &amp;&amp; newData.exists()" 文档示例中的 sn-p 使用 &amp;&amp;,您使用的是 || 我为 @frankvanpuffelen 道歉。但是".write": "!data.exists() &amp;&amp; newData.exists()" 在测试时也阻止了任何写入?回去测试所有 3 个( &&、|| 和 !data.exists() )版本只是为了确定; && 和 !data.exists() 在 || 时防止写入当用户再次登录时删除所有内容。【参考方案2】:

如果我没看错问题,那么问题不在于你的规则,而在于每次用户验证他们之前保存的信息时都会被删除。如果是这种情况,那么我会说您的问题是,正如您所猜测的那样,

ref.child("users").child(authData.getUid()).setValue(map);

setValue() 函数将转到您的特定用户节点并清除所有其他数据 - 仅将其替换为 displayName。

我想你会想要 updateChildren() 方法而不是 setValue()

ref.child("users").child(authData.getUid()).updateChildren(map);

这应该只更新用户名并保留剩余数据。

【讨论】:

感谢@kyle 的输入。从文档中不知道我可以使用该方法进行初始登录,但它似乎有效。我删除了整个用户节点,但 updateChildren 在调用时将其重新写入数据库。

以上是关于Firebase 重新登录/额外登录会删除所有用户数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 firebase google 退出后,我再次登录。我保留在数据库中的所有数据都被删除

Flutter Firebase - 未能正确删除经过 Google 身份验证的用户

Flutter Firebase 不保留用户身份验证

从firebase删除数据后无法使用google和facebook登录

颤动的firebase登录问题

每次用户签名时,TableView 都会重新加载并添加(重复)原始数据