【问题标题】:Permission denied when read data after authentication Firebase身份验证 Firebase 后读取数据时权限被拒绝
【发布时间】:2015-11-23 17:07:06
【问题描述】:

我是 Firebase 的新手,在身份验证 Firebase 后读取数据时出现的问题是 PERMISSION DENIED。我研究了所有主题,在这里发现了同样的问题: Firebase Permission denied when reading data after authentication .但是 Frank van Puffelen 的回答对我不起作用。这是我的 Firebase 规则:

{
"rules": {
  "user": {
    "$uid": {
      "profile": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
      },
      "account": {
        ".read": false,
        ".write": false
      },
      "shared": {
        "$sharedid": {
          ".read":  "auth != null && auth.uid == $uid",
          ".write": false
        }
      },
      "shared_user": {
        ".read": false,
        ".write": false
      }
    }
  },
  "node": {
    "$uid": {
      ".read": "auth != null && auth.uid == $uid",
      ".write": "auth != null && auth.uid == $uid"
    }
  },
 "shared": {
    "$sharedid": {
      ".read": "auth != null && root.child('user').child(auth.uid).child('shared').child($sharedid).child('read').val() === true",
      ".write": "auth != null && root.child('user').child(auth.uid).child('shared').child($sharedid).child('write').val() === true"
    }
  }
}

}

我找到了很多方法,但仍然被拒绝。请帮帮我!

编辑:这是我的认证:

mFirebaseRef= new Firebase("https://my-dashboard.firebaseio.com");
mFirebaseRef.authWithPassword(Constants.EMAIL, Constants.PASSWORD, new AuthResultHandler("password"));

授权句柄:

private class AuthResultHandler implements Firebase.AuthResultHandler{

    private final String provider;

    public AuthResultHandler(String provider){
        this.provider=provider;
    }
    @Override
    public void onAuthenticated(AuthData authData) {
        Log.i(TAG, provider + " auth successful");
        getData(mFirebaseRef.child("node"));
    }

    @Override
    public void onAuthenticationError(FirebaseError firebaseError) {
        Log.i(TAG, provider+ " auth unsuccessful");
    }
}

最后,获取数据:==> Permission denied ?

private void getData(Query ref){
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.i(TAG, " onDataChange");
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
            Log.i(TAG, firebaseError.getMessage());
        }
    });
}

【问题讨论】:

  • 请为失败的读取操作添加最小代码。请务必包含它开始读取的路径。

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


【解决方案1】:

你做错了。您的代码表明您在安全规则中没有“节点”子级的读写权限。您对“节点”的子节点(即“$uid”)具有读写权限。

所以改变:

getData(mFirebaseRef.child("node"));

收件人:

getData( mFirebaseRef.child("node").child(authData.getUid()) );

记住:Firebase 安全规则以自上而下的方式工作,如果您不提及规则,默认情况下 read 和 write 都是 false。因此,在子“节点”处,您没有提到读取或写入权限,因此默认情况下它是错误的。但是对于内部孩子'$uid',您已经提到了读写安全规则,因此它可以被读取或写入,假设客户端使用相同的uid进行身份验证。

另外,请记住,如果您在顶层指定读写权限,那么内部定义没有任何意义,例如,假设您有如下规则:

.
.
"node" : {

    ".read" : true,

    "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
    }
}
.
.

在上面的例子中,任何人都可以读取 'node' 子及其所有子,其中包括 '$uid' 子,因为 '$uid' 的父定义了 read-all 安全规则,它所有子的安全规则将被覆盖。因此,请注意规则定义。

希望这能解决你的问题:)

【讨论】:

  • 感谢您的帮助,我解决了很久。但是现在,我不使用 Firebase,因为它不支持我想要的某些功能。
  • 哦,我明白了。没关系,我刚刚遇到了同样的问题,所以我想让我们帮助你解决这个问题。希望这对某人有帮助:)
猜你喜欢
  • 2016-02-09
  • 1970-01-01
  • 2016-11-07
  • 2018-08-21
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多