【发布时间】: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