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

时间:2018-10-31 08:55:21

标签: firebase firebase-realtime-database firebase-security-rules

我正在尝试建立一个聊天室,您可以在其中看到所有消息,但被排除在外的消息除外。 您(很难)无法使用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将看到消息。

→user2不会。

现在,我尝试构建仅强制执行此查询的适当规则,该规则应类似于query.orderByChild == auth.uid && equalTo == true

这里的问题是query.orderByChild == auth.uid,它指示此错误:

  

“无效==表达式:右操作数必须是有序或字符串   与订单进行比较时的原义。”

已将票证提交给了Firebase支持,但idk需要花费多少时间,因此可以解决此问题,这就是我正在寻找替代方案的原因。

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

我非常喜欢火力基地,但是对我来说,一些容易想到的事情对我来说已经变得很重要了吗?

1 个答案:

答案 0 :(得分:1)

这听起来像是个错误,尤其是在规则系统似乎在进行其他一些健全性检查(错误消息不会中继)的情况下。例如,即使从技术上来说,这是一个(无效的)字符串文字,也无法使用query.orderByChild == 'auth.uid'

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

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

因此,您不必使用true作为每个用户的值,而是使用用户的ID(以匹配键名)。因此,您的查询将需要类似于:

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

您的安全规则为:

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

当您在Firebase支持下提出问题时,他们也许可以提供更多的见解或发布修复程序,但这暂时应该起作用。