当前位置: 首页 > 知识库问答 >
问题:

Firebase规则不允许从数据库读取

齐振
2023-03-14

我遇到的问题是,使用下面显示的以下Firebase规则,经过身份验证的用户可以成功写入数据库,但无法从中读取,因为我在控制台中获得了“拒绝权限”。当我将读取和写入设置为true(公共)时,读取和写入功能都正常工作。我从数据库中读取的代码也显示如下:

 private String userID;
    private FirebaseDatabase mFirebaseDatabase;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private DatabaseReference myRef;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        //Authenticate user
        mAuth = FirebaseAuth.getInstance();
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        myRef = mFirebaseDatabase.getReference();
        FirebaseUser user = mAuth.getCurrentUser();
        if(mAuth.getCurrentUser() == null){
            finish();
            startActivity(new Intent(this, MainActivity.class));
        }
        userID = user.getUid();

public void onDataChange(DataSnapshot dataSnapshot) {
                    ArrayList<CharSequence> array = new ArrayList<>(Arrays.asList(HomeActivity.this.getResources().getTextArray(R.array.array)));
                        map = (Map<String, Object>) dataSnapshot.child("users").child(userID).getValue();
                        int x = 16;
                        for (Map.Entry<String, Object> entry : map.entrySet()) {
                            String key = entry.getKey();
                            array.add(x, key);
                            x++;
                        }

规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

示例数据库:

{
  "users" : {
    "9kV3otdvOXU0ssMZWIdfggrBrj63" : {
      "Citrus" : [ "orange", "lime", "mandarin", "lemon" ],
      "Fruit" : [ "apple", "banana", "mango" ],
      "Meat" : [ "beef", "pork", "lamb", "chicken" ],
      "Veg" : [ "tomato", "potato", "cabbage" ]
    }
  }
}

以下是确切的错误:

W/SyncTree: Listen at / failed: DatabaseError: Permission denied

共有1个答案

虞航
2023-03-14

正如Doug已经评论的那样,如果不查看您将侦听器附加到什么数据,就很难提供帮助(因此,您在其上调用addValueListeneraddListenerForSingleValue事件数据库参考)。但是从侦听器中的这段代码来看,您似乎在监听/

dataSnapshot.child("users")

您的用户都没有权限读取/,因为您只允许他们访问/user/$uid。你的代码现在不仅违反了你的安全规则,如果它成功了,它将下载比需要更多的数据。

相反,您应该将侦听器附加到JSON树中包含您需要(并且具有读取权限)的所有数据的最低级别。在你的例子中,似乎是/user/$uid,所以你会这样做:

DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users");
DatabaseReference userRef = usersRef.child(userID);
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
  public void onDataChange(DataSnapshot dataSnapshot) {
    ArrayList<CharSequence> array = new ArrayList<>(Arrays.asList(HomeActivity.this.getResources().getTextArray(R.array.array)));
        map = (Map<String, Object>) dataSnapshot.getValue();
        int x = 16;
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String key = entry.getKey();
            array.add(x, key);
            x++;
        }
 类似资料:
  • 我当前的Android应用程序使用Firebase实时数据库。 我正在与安全规则作斗争,因为我希望只允许单个用户写入数据,同时允许任何经过身份验证的用户读取数据。 我制定了这些规则,但不确定它们是否足够安全。。。 其中“XXXXXXXXXXXXXXXXXXXX”是我希望允许写入数据的指定用户。 用户的uid是常量值吗? 在测试新规则时,单击“模拟”按钮时,“验证”选项管理什么?

  • 好的,我有一个实时数据库连接到一个应用程序,直到今天规则(读写)都设置为真,一切都很好。。。。但每次有消息说 您的安全规则定义为public,因此任何人都可以窃取、修改或删除数据库中的数据 我尝试了几件事,但没有访问数据。。。只有当规则设置为true时,才能访问数据 但有没有办法修改规则,使其更安全 我希望只有少数已知的应用程序(我的应用程序)可以访问此数据

  • 我尝试用规则返回用户聊天列表。所以我不知道对话的id。我尝试了几种方法,但都不起作用,因为你必须知道聊天id。 数据库: 规则: 但当我从react本机应用程序访问时。通过身份验证的用户无法访问聊天记录(uid:3Oi1atf8l2P4Vgsb8tZOGxpUg7q2) *读取失败:错误:权限被拒绝/Chats:客户端没有访问所需数据的权限。 规则: 查询:

  • 我使用以下规则检查只有“管理员”才能写入陷阱部分。 这个很好用。但是如果我把规则改为, 然后我得到了一个权限错误。W/SyncTree:侦听/traps失败:数据库错误:权限被拒绝。 我之所以改变结构,是因为我试图使用validate函数,但由于我无法通过第一个问题,我无法达到验证的程度。 我肯定这是一个新手理解错误,但在尝试了许多排列后,我在这方面进展甚微。您的协助将不胜感激。 更新201606

  • 我在中收到一条消息,告诉我我的项目有不安全的规则。但当我检查它时,我不太明白什么是不安全的。 它显示如下: 我保留了读取访问权限,因为它支持一个网站。所以任何访问该网站的人都应该能够读取数据。 至于写权限,据我所知,我是唯一能写的人。 请注意,我还有第三个系列(CollectionThree),规则中没有提到。这可能是原因吗? 除此之外,我还可以想象,只有web服务器可以获得读取权限,以便将内容提

  • 我试图从Firebase数据库中读取数据,我已经到处阅读和查找,但我已经走到了死胡同。 这就是我所做的一切。 依赖项: 实现'com.google.firebase: Firebase存储: 9.2.1' 实现'com。谷歌。firebase:firebase数据库:9.2。1' 实现'com。谷歌。firebase:firebase授权:9.2。1' 实现'com。谷歌。火基:火基核心:9.2。