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() && newData.exists()"
文档示例中的 sn-p 使用 &&
,您使用的是 ||
我为 @frankvanpuffelen 道歉。但是".write": "!data.exists() && 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 身份验证的用户