我的客户端无法从firebase数据库读取消息

我的客户端无法从firebase数据库读取消息,firebase,firebase-realtime-database,firebase-authentication,firebase-security,Firebase,Firebase Realtime Database,Firebase Authentication,Firebase Security,以下是我的firebase规则: { "rules": { "intents" : { ".read" : "auth.uid === data.child('to').val()", ".write" : true }, "messages" : { "$user" : { ".read": "auth.uid === data.child('to').val() ||

以下是我的firebase规则:

{
  "rules": {
    "intents" : {
      ".read" : "auth.uid === data.child('to').val()",
      ".write" : true
    },
    "messages" : {
      "$user" : {
           ".read":  "auth.uid === data.child('to').val() || 
                      auth.uid === data.child('from').val() ||
                     (auth.uid === 'iAmEd' && data.child('to').val() === 'Ed') || 
                      data.child('to').val() === 'all'",
           ".write": true
      }
    }
  }
}
有关
消息的读取操作的说明如下:

  • 如果将消息发送给用户a,则允许a读取该消息(
    auth.uid===data.child('to').val()

  • 如果消息由用户a发送,则允许a读取它(
    auth.uid==data.child('from').val()

  • 服务器可以读取所有消息(即
    uid=“iAmEd”
    ),并且消息必须在
    部分中具有“Ed”。(
    (auth.uid=='iAmEd'和&data.child('to').val()=='Ed')
  • 如果将消息作为
    发送到
    =“all”,则每个人都可以阅读该消息
  • 尽管写操作工作正常。但是我的客户无法阅读任何消息,无论是它发送的消息,还是
    to
    设置为
    all
    的消息

    以下是两条示例消息供参考:

    {
      "messages" : {
        "-KViVgc7ZG051eMXP0-5" : {
          "from" : "Ed",
          "name" : "Ed",
          "photoUrl" : "https://cdn1.iconfinder.com/data/icons/user-pictures/100/male3-512.png",
          "text" : "Hello, I'm Ed",
          "timeStamp" : "1476880306",
          "to" : "all",
          "type" : "text"
        },
        "-KWK50chFl_QroPwoYVu" : {
          "from" : "Capyv3mxQsUUn2W1nPOgcJ0Ex9T2",
          "name" : "Aakash Bansal",
          "photoUrl" : "https://lh5.googleusercontent.com/-oQyA4HXVycc/AAAAAAAAAAI/AAAAAAAAHKo/Ov0A0p0LjiY/s96-c/photo.jpg",
          "text" : "hi",
          "timeStamp" : "1478896392",
          "to" : "Ed",
          "type" : "text"
        }
      }
    }
    
    我也看过几段youtube视频,但它们并没有提到如何比较firebase安全规则中的字符串

    编辑:当我使用这些简单规则时,它们也不起作用。虽然用户能够写,但它没有读取任何消息

    {
      "rules": {
        "intents" : {
          ".read" : "auth.uid === data.child('to').val()",
          ".write" : true
        },
        "messages" : {
          "$message" : {
               ".read" : "data.child('from').val() === auth.uid"
          },
              ".write": true
        }
      }
    }
    
    另外,如果您认为它们可能是我的Android代码或RecyclerAdapter实现中的一些问题,我可以告诉您,当我使用
    “.read”:true
    ,Android能够正确地读取代码

    因此,他们肯定只是我的规则有问题

    编辑2还有一个问题,当我使用以下规则时,应用程序仍然无法读取数据

    {
    "rules": {
      "intents" : {
        ".read" : "auth.uid === data.child('to').val()",
        ".write" : true
      },
      "messages" : {
        "$message" : {
               ".read":  true,
        },
            ".write": true
      }
    }
    }
    
    但当我使用以下代码时,应用程序会准确读取数据:

    {
    "rules": {
      "intents" : {
        ".read" : "auth.uid === data.child('to').val()",
        ".write" : true
      },
      "messages" : {
            ".read":  true,
            ".write": true
      }
    }
    }
    
    以下是读取数据的android代码:

    MessageAdapter.java

    public class MessageAdapter extends FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder> {
        private static final String TAG = MessageAdapter.class.getSimpleName();
        private ProgressBar mProgressBar;
    
        private Context context;
    
        public MessageAdapter(Class<FriendlyMessage> modelClass, int modelLayout, Class<MessageViewHolder> viewHolderClass, DatabaseReference ref, Context context, ProgressBar progressBar) {
            super(modelClass, modelLayout, viewHolderClass, ref);
            this.context = context;
            this.mProgressBar =progressBar;
        }
    
        @Override
        protected void populateViewHolder(MessageViewHolder viewHolder, FriendlyMessage friendlyMessage, int position) {
            Log.d(TAG, "populateViewHolder reached");
            mProgressBar.setVisibility(ProgressBar.INVISIBLE);
            viewHolder.getMessageTextView().setText(friendlyMessage.getText());
            viewHolder.getMessengerTextView().setText(friendlyMessage.getName());
            if (friendlyMessage.getPhotoUrl() == null) {
                viewHolder.getMessengerImageView()
                        .setImageDrawable(ContextCompat
                                .getDrawable(context,
                                        tod));
            } else {
                Glide.with(getApplicationContext())
                        .load(friendlyMessage.getPhotoUrl())
                        .into(viewHolder.getMessengerImageView());
            }
            boolean temp;
            try {
                temp = friendlyMessage.getName().equals("Ed");
            } catch (NullPointerException e) {
                temp = false;
            }
            if (temp) {
                viewHolder.getDiffForRecSend().setBackgroundResource(R.drawable.bubble);
                viewHolder.getMessageTextView().setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.white));
                viewHolder.getMessengerTextView().setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.white));
            } else {
                viewHolder.getDiffForRecSend().setBackgroundResource(R.drawable.blankbluebububble);
                viewHolder.getMessengerTextView().setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.blue1));
                viewHolder.getMessageTextView().setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.blue));
            }
            Log.d(TAG, "populateViewHolder ended");
        }
    }
    
      /***/
      mFirebaseAdapter = new MessageAdapter(FriendlyMessage.class,
                  R.layout.item_message,
                  MessageViewHolder.class,
                  mFirebaseDatabaseReference.child("/messages"),
                  context,
                  mProgressBar);
      /***/
    
    我只是简单地使用了FirebaseUI和扩展它的自定义回收器适配器


    任何帮助都将不胜感激

    请与我们分享。既然您说您不能读取数据,请显示尝试读取数据但失败的代码。通常,这也会在logcat中显示错误消息。如果是的话,在你的问题中也包括这一点。@Frank van Puffelen,我真的不明白为什么这些规则不起作用。我在谷歌群组中查看了答案,但没有任何帮助!请与我们分享。既然您说您不能读取数据,请显示尝试读取数据但失败的代码。通常,这也会在logcat中显示错误消息。如果是的话,在你的问题中也包括这一点。@Frank van Puffelen,我真的不明白为什么这些规则不起作用。我在谷歌群组中查看了答案,但没有任何帮助!