我是Firebase中的新手,这是我在认证Firebase被允许拒绝后读取数据的问题。我研究所有主题,我在这里发现了同样的问题: 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");
}
}
最后,获取数据:==> 权限被拒绝?
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());
}
});
}
答案 0 :(得分:2)
你做错了。您的代码表明您在安全规则中没有“node”子级的读写权限。您对“node”的子级具有“$ uid”的读写权限。
所以改变:
getData(mFirebaseRef.child("node"));
致:
getData( mFirebaseRef.child("node").child(authData.getUid()) );
请记住:Firebase安全规则使用自上而下的方法,如果您不提及规则,默认情况下,读取和写入都是错误的。因此,在子节点'你没有提到读或写权限,因此,默认情况下,它是假的。但对于内部子'$ uid',您已经提到了读写安全规则,因此可以读取或写入,因为客户端使用相同的uid进行身份验证。
另外,请记住,如果您在顶级指定读写权限,那么内部定义没有意义,例如,假设您有以下规则:
.
.
"node" : {
".read" : true,
"$uid": {
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
}
.
.
在上面的例子中,任何人都可以读取'node'子节点及其所有子节点,其中包括'$ uid'子节点,因为'$ uid'的父节点已经定义了所有安全规则,其所有子节点的安全性规则将被覆盖。因此,请注意规则定义。
希望这能解决您的问题:)