代码之家  ›  专栏  ›  技术社区  ›  Emeric

Firebase规则query.orderByChild==auth.uid的替代规则

  •  1
  • Emeric  · 技术社区  · 6 年前

    我试图建立一个聊天室,你可以看到所有的消息,除了你被排除在外的消息。 你(很遗憾)不能用firebase查询“isNotEqualTo”,这就是我不得不作弊的原因,这里有一个更清楚的例子:

    假设我们有3个用户:user1、user2和user3。user1为除user2之外的所有用户发布了一条消息,这将是:

    messages
       |__ 0
           |__ "author": "user1"
           |__ "message": "hello world"
           |__ "user1": true
           |__ "user3": true
    

    现在我可以查询:

    firebase.database().ref("messages").orderByChild(myAuthUid).equalTo(true)...
    

    user1和user3将看到消息。

    用户2将不会。

    现在,我尝试构建适当的规则,仅强制执行此查询,如下所示 query.orderByChild == auth.uid && equalTo == true

    这里的问题是 query.orderByChild == auth.uid 指的是这个错误:

    “无效==表达式:右操作数必须是顺序或字符串 与排序进行比较时的文本。”

    一张罚单已经提交给firebase支持,但idk需要多少时间才能解决这个问题,这就是为什么我在寻找一个替代品。

    与此问题相关的另一个主题: Query-based rules with auth.uid not working

    我太喜欢火基了,但我觉得简单的东西对我来说是件大事,有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Grimthorr Roland77    6 年前

    这听起来像是一个bug,尤其是规则系统似乎在做一些额外的健全性检查,以确保错误消息不会被转发。例如,使用 query.orderByChild == 'auth.uid' 也不起作用,即使这在技术上是一个(无效的)字符串文本。

    作为一种解决方法,您可以只使用 query.equalTo == auth.uid 作为一项安全规则,但这将意味着调整数据库结构,改为遵循以下格式:

    messages
       |__ 0
           |__ "author": "user1"
           |__ "message": "hello world"
           |__ "user1": "user1"
           |__ "user3": "user3"
    

    所以不用 true

    firebase.database().ref("messages").orderByChild(myAuthUid).equalTo(myAuthUid)
    

    {
      "rules": {
        ".read": "auth.uid != null && query.equalTo == auth.uid"
      }
    }
    

    当您通过Firebase支持提出这个问题时,他们可能能够提供更多的见解或发布一个修复程序,但这应该暂时起作用。

    推荐文章