Firebase 安全权限

Firebase Security Permissions

我遇到了试图访问其他人电子邮件的用户的问题。我得到 E/ContactsFragment.java: Finding email failed. DatabaseError: Permission denied。还值得注意的是,电子邮件在进入数据库之前会经过检查,而且我输入的电子邮件与数据库中的电子邮件相同。 基本上,我要做的是让 user1 找到 user2 的电子邮件。从那里,我将对电子邮件进行一些处理。

{
  "rules": {
    "users":{
      ".indexOn": ["email"],
      "$uid":{
        ".read": "auth !== null",
        "email":{
          ".write": "auth !== null && $uid === auth.uid",
          ".validate": "newData.isString()"
        }
      }
    }
  }
}

这是我的数据结构:

这是我尝试访问电子邮件的代码:

final String TAG = "ContactsFragment.java";
FirebaseDatabase.getInstance().getReference().child("users").orderByChild("email").equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // some code
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.e(TAG,"Finding email failed. " + databaseError);
            }
        });

我该如何解决?我错过了什么重要的东西吗?

目前,您的规则只授予 /users 节点下的子节点读取权限,而不是 /users 节点本身,这将拒绝他们查询列表。

如果您将 .read 规则移到 $uid 子项之外,它将允许用户查询 /users 列表节点:

{
  "rules": {
    "users":{
      ".indexOn": ["email"],
      ".read": "auth !== null",
      "$uid":{
        "email":{
          ".write": "auth !== null && $uid === auth.uid",
          ".validate": "newData.isString()"
        }
      }
    }
  }
}

查询附加到列表节点而不是列表下的子节点,因此需要在列表本身上授予 .read 权限。例如,您的查询附加到 /users 节点:

FirebaseDatabase.getInstance().getReference().child("users").orderByChild("email").equalTo(email)[...]

这是因为 rules are applied in an atomic manner,因此深路径的 .read 规则将不允许访问较浅的路径。