android - 身份验证后读取数据时权限被拒绝 Firebase

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

我是 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"
    }
  }
}

我找到了很多方法,但仍然得到 PERMISSION DENIED。请帮助我!

编辑:这是我的验证:

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());
        }
    });
}

最佳答案

你做错了。您的代码表明您在安全规则中没有对“节点”子项的读写权限。您对“节点”的子级“$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'的父节点定义了读取所有安全规则,其所有子节点的安全规则将被覆盖。因此,请谨慎对待规则定义。

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

关于android - 身份验证后读取数据时权限被拒绝 Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33876618/

相关文章:

android - 签名验证失败 - Android 应用内购买

java - Spinner 给出的资源 ID 无效

javascript - Firebase Twitter 身份验证和跨站点脚本

javascript - 如何设置 Firebase 数据库规则以不允许删除或更新子项?

firebase - Firestore规则,使用短路来挤出读取

android - 无法解析 : com. android.support :appcompat-v7:28. 0

android - 应用程序在手机和 ripple 中的渲染不同

firebase - 在 Flutter 上单击背景通知时如何导航?

android - geofire android 存储和检索位置并将其显示在 map 上

http - Firebase APP 部署失败,HTTP 错误 : 500, 请求包含无效参数