【问题标题】:Firebase Security PermissionsFirebase 安全权限
【发布时间】:2017-11-06 12:30:40
【问题描述】:

我遇到了试图访问他人电子邮件的用户的问题。我收到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 下的子节点的读取访问权限的情况是,如果该用户未经过身份验证(根据".read": "auth !== null"),那么您将在尝试访问数据之前需要确保用户已通过身份验证。
  • 这个函数在登录活动之后运行,我能够检查用户是否能够通过登录活动进行身份验证。所以我怀疑用户未经身份验证
  • 好的,有道理。您可以通过执行 FirebaseAuth.getInstance().getCurrentUser() 来确认用户已通过身份验证,如果用户未通过身份验证,它将返回 null,如果用户通过身份验证,则返回 FirebaseUser 实例。
  • 是的。当我执行该方法时,它不为空。

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


【解决方案1】:

目前,您的规则仅授予 /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 规则将不允许访问较浅的路径。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    相关资源
    最近更新 更多