我正在尝试在我的应用程序中实现一个功能,让经过身份验证的用户通过输入用户的电子邮件地址来搜索其他用户。我试图找出在firebase中实现安全规则的最佳方法,以允许这种类型的搜索,但不允许登录用户只是通过/ users列出所有用户。
目前我有这个安全规则:
"users" : {
".indexOn" : "email",
".read": "auth != null",
"$uid": {
".write": "auth.uid === $uid"
}
这显然允许任何经过身份验证的用户阅读整个用户集合。删除此行:
".read": "auth != null"
解决了这个问题,但现在我无法再通过电子邮件搜索用户了。这里推荐的方法是什么?
答案 0 :(得分:1)
Firebase有两个您可以授予的权限:
没有单独的权限允许搜索,这意味着任何可以搜索节点的人也可以读取该节点。
但是可能有一种解决方法可以解决您的问题。如果我们假设您有这样的用户节点:
users
twitter:4368352
id:4368352
name: "lestyn Lewis"
email: "lewis@lestyn.net"
twitter:209103
id:209103
name: "Frank van Puffelen"
email: "puf@stackoverflow.com"
提示:如果您可以更新问题并包含用户节点的实际结构,那就太好了。
使用上述结构,您必须为.read
下的所有节点授予用户Users
权限。这样,他们不仅可以阅读电子邮件地址和ID,还可以阅读您可能保留的任何其他信息。
要让您的用户只访问此数据的一部分,您可以将该数据复制到另一个节点。因此,如果您想允许所有用户搜索电子邮件地址,那么您需要添加一个将电子邮件地址映射到uid的节点:
users
twitter:4368352
id:4368352
name: "lestyn Lewis"
email: "lewis@lestyn.net"
twitter:209103
id:209103
name: "Frank van Puffelen"
email: "puf@stackoverflow.com"
email_to_uid:
"lewis@lestyn.net": "twitter:4368352"
"puf@stackoverflow.com": "twitter:209103"
然后,您可以授予所有用户搜索权限,但只允许向更有限的一组用户授予对完整用户设置的访问权限:
"users" : {
".indexOn" : "email",
"$uid": {
".read": "auth === $uid",
".write": "auth.uid === $uid"
}
},
"email_to_uid" {
".read": "auth != null"
}
请注意,您实际上是在构建自己的索引,类似于".indexOn": "email"
所做的索引,以便您可以控制其中的信息以及可以访问的信息。