首页 > 解决方案 > 使用 auth.uid 的基于查询的规则不起作用

问题描述

我有以下结构:

events
-LEe7X118dkcH2JhJRe
    description: "Testdescr"
    eventTasks
    participants
        0zlwpSlCazNGjOyMi95h8awshrG2
            lastLogin: 1528641494535
            userKey: "0zlwpSlCazNGjOyMi95h8awshrG2"
            username: "User1"
        6LnYKxRu2SWUrxwIzId8dDpOrl02
            lastLogin: 152856590172
            userKey: "6LnYKxRu2SWUrxwIzId8dDpOrl02"
            username: "User2"

我想查询用户参与的所有事件(如过滤器)。我的 Java 代码是:

mDatabaseReference = FirebaseDatabase.getInstance().getReference("event");
mDatabaseReference.orderByChild("participants/"+userId+"/userKey").equalTo(userId).addChildEventListener [...]

这就像一个魅力 - 我只收到正确的事件。

现在我想在服务器端创建基于查询的规则(https://firebase.google.com/docs/database/security/securing-data)。所以我创建了一个读取规则,例如:

".read": "query.orderByChild == 'participants/'+auth.uid+'/userKey' && query.equalTo == auth.uid"

问题:我无法保存该规则。Firebase 给了我错误:“无效的 == 表达式:与排序进行比较时,右操作数必须是排序或字符串文字。”。为什么不能将“query.orderByChild”与 auth.uid 结合使用?

我究竟做错了什么?

编辑:这是我的完整规则:

{
  "rules": {         
    ".write": true,
     "event":{
       ".read": "query.orderByChild == 'participants/'+auth.uid+'/userKey' && query.equalTo == auth.uid"      
     }
  }
}

标签: firebasefirebase-realtime-databasedatabase-designfirebase-security

解决方案


推荐阅读