我遇到了问题,我尝试了一切,但我无法找到解决方案。我有这样的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上的用户标识时才能读取聊天节点。我尝试了几种方法来制定规则而没有成功。谁能指出我正确的方向?谢谢
答案 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写入,因此您可以根据需要更新为相应的值何时发送新的聊天消息。