阻止用户查找已阻止其Firebase的用户 [英] Prevent user from finding users that have blocked them Firebase

查看:14
本文介绍了阻止用户查找已阻止其Firebase的用户的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序中,我不希望被其他用户屏蔽的用户找到这样的用户。 假设用户1阻止了用户2。然后,当用户2搜索应用程序中的所有用户时,我希望用户2找到除用户1之外的所有用户,因为用户1已经阻止了用户2。这就像Instagram,当你屏蔽某人时,某人无法以任何方式与你互动。我将用户存储在实时数据库中,如下所示:

users
|-user2(uid)
   |-blocks
       |-user1(uid): 1
   |-email: String
   |-id: String(the uid)
   |-fcm: String
   |-name: String
   |-profileImage: String
   |-username: String

我正在尝试使用以下Firebase规则阻止用户2与用户1交互:

{
"rules": {
  "users": {
    "$uid": {
".read": "auth != null && !(root.child('users').child(auth.uid).child('blocks').hasChild($uid) != true)",
".write": "auth != null"
}
},
  "posts": {
    "$postId": {
      ".read": "auth != null",
        ".write": "auth != null"
    }
  }
}
}
在查看另一个用户的关注者列表时,用户2无法再看到用户1,尽管用户1在该列表中。所以安全规则在那里是有效的。但现在,我的应用程序中的任何用户都不能再寻找任何其他用户,因为一旦激活搜索,我的控制台就会显示:

[Firebase/Database][I-RDxx0xxxxx] Listener at /users failed: permission_denied

在每一个其他窗口或其他用户的关注者列表中,控制台都会显示以下内容:

[Firebase/Database][I-RxxBxxxxxx] Listener at /users/user1 failed: permission_denied

这表明它在某种程度上起作用,因为只有用户1的权限被拒绝。

那么错误出在哪里?

推荐答案

Firebase安全规则不筛选数据。它们只是强制规则允许您尝试访问的数据。

这一点非常重要,甚至有一个文档部分介绍它:rules are not filters。然而,考虑到之前的questions on the topic,这也是一个常见的混淆来源。

因为在您的规则中没有人被授予访问/users的权限,所以尝试从/users读取的代码将被拒绝。由于您的测试用户显然被user1阻止,因此那里的规则拒绝他们的访问。


securely query data规则和代码需要协同工作。代码应该只请求它被允许访问的数据,以便规则可以验证这一点。

在您的情况下,这意味着用户只能在以某种方式排除阻止他们的用户的情况下才能请求/users。不幸的是,这在Firebase查询中是不可能的,所以您必须为这个用例设计一个不同的数据模型,或者逐个加载用户数据。后者的速度远不如您最初认为的那样慢,不如Firebasepipelines the requests over a single connection

这篇关于阻止用户查找已阻止其Firebase的用户的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆