我是 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/