我正在使用Firebase开发适用于Android的联系人应用程序,我想从数据库中与指定电子邮件匹配的用户中读取值(此处为用户个人资料)。
我试图设计查询,如以下答案所示:https://stackoverflow.com/a/39025129/8739722,但问题是我不知道如何将其应用于数据库结构,因为我的用户中有另一个孩子(配置文件)结构。
我的节点如下:
我的规则如下:
{
"rules": {
"users": {
"$uid": {
"profile": {
".read": "auth.uid != null",
".write": "auth.uid == $uid",
},
//...
},
}
我试图这样查询:
String email = "email_address_1";
Query q_1 = ref.child("users").child("profile").orderByChild("email").equalTo(email);
...导致“权限被拒绝”错误。
我也考虑过以下查询,但是它们的语法无效或尝试执行不允许的多个orderByChild调用:
String email = "email_address_1";
Query q_2 = ref.child("users").orderByChild("profile").child("email").equalTo(email);
Query q_3 = ref.child("users").orderByChild("profile").orderByChild("email").equalTo(email);
如何通过匹配的电子邮件获取用户的个人资料?
答案 0 :(得分:0)
Firebase实时数据库查询对单个属性进行过滤和排序,该属性位于运行查询的位置的每个子节点下的固定路径/名称下。在您的情况下,该属性位于profile/email
下,因此您的查询变为:
ref.child("users").orderByChild("profile/email").equalTo(email);
但是请注意,您的规则将拒绝此查询,因为它们请求从/users
读取数据,并且您不授予任何人从那里读取数据的权限。当您附加侦听器时,将强制执行Firebase安全规则,并且不能用于过滤数据。要了解更多有关此内容的信息,请阅读文档部分rules are not filters和许多questions mentioning that same phrase。
要快速测试以上查询,您可以临时授予对/users
的所有访问权限。只需确保将其更改回与任何用户共享您的应用程序。
要正确保护数据,您需要在安全规则中验证用户仅尝试读取自己的数据。您可以使用query based security rules进行此操作。在您的情况下,它们看起来像这样:
"users": {
".read": "auth.email != null &&
query.orderByChild == 'profile/email' &&
query.equalTo == auth.token.email"
}