Firebase数据库规则父母监视子项

时间:2018-01-29 22:53:34

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

我遇到了问题,我尝试了一切,但我无法找到解决方案。我有这样的firebase数据库。聊天:

-chats
--0
---标题=""
--- lastmsg =""
---时间戳=""
--1
---标题=""
--- lastmsg =""
---时间戳=""

然后:

- 成员
--0
--- UID0 ="真"
--- UID1 ="真"
--1
--- UID2 ="真"
--- UID3 ="真"

现在,我有这个java代码来处理列表。

            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference myRef = database.getReference("chats");
             myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.

            Iterable<DataSnapshot> children = dataSnapshot.getChildren();

            for (DataSnapshot child : children) {
                String titolo = (String) child.child("titolo").getValue();
                String ultimomsg = (String) child.child("ultimomsg").getValue();
                Long timestamp = (Long) child.child("timestamp").getValue();
                Log.w(TAG, "Title is: "+ titolo);
                CHATITEMS.add(new DummyItem(child.getKey(), titolo, ultimomsg, timestamp));
            }
            RecyclerView recyclerView = (RecyclerView) view;
            recyclerView.setAdapter(new MyPersonRecyclerViewAdapter(CHATITEMS, mListener));
        }

现在,我希望用户只有在节点成员/ chatnumber / userid上的用户标识时才能读取聊天节点。我尝试了几种方法来制定规则而没有成功。谁能指出我正确的方向?谢谢

1 个答案:

答案 0 :(得分:1)

Firebase user security文档提供了一个很好的教学起点,有助于了解如何构建不同的规则以保护指定路径的数据。在您的情况下,您希望/chats/$chat_id路径可读,具体取决于/members/$chat_id/$user_id是否存在已登录用户的uid。要做到这一点,您的安全规则应该是:

{
  "rules": {
    "chat": {
      "$chat_id": {
        ".read": "root.child('members/' + $chat_id + '/' + auth.uid).exists()",
        ".write": false
      }
    }
  }
}

您可能希望.write规则为false,以防您通过Cloud function对该数据库路径进行Admin SDK写入,因此您可以根据需要更新为相应的值何时发送新的聊天消息。