我想给多个用户访问以获取他们在Firebase Realtime数据库中可以访问的“消息”集合。数据库提取将读取“ / messages”,并返回用户有权访问的所有消息的集合。数据库结构如下所示:
"messages" : {
"-L123456789": {
"access": {
"author": "user-one-id-987654"
"assigned-user-id-1234": "assigned-user-id-1234"
}
"data" : {
"theData": "Hello world!"
}
}
}
我创建了以下规则:
{
"rules": {
"messages": {
"$message_id": {
"data": {
".read": "
//if author or assigned user
data.parent().child('access').child('author').val() === auth.uid ||
data.parent().child('access').child(auth.uid).exists()
",
".write": "false"
}
}
}
}
但是,当我被列为作者或指定用户时,我无法获得所有消息的集合。
通过什么规则,被列为“作者”(user-one-id-987654)或“已分配用户”(assigned-user-id-1234)的用户只需阅读“ / messages /“数据库路径?
我猜“消息”根源中的规则可能是答案?
我尝试了以下规则-它授予所有经过身份验证的用户访问权限-但我只希望返回将用户列为“作者”或“已分配用户”的集合。
{
"rules": {
"messages": {
".read": "auth.uid !== null"
}
}
}
亲切的问候
/千
最佳答案
Firebase服务器端安全规则不能用于过滤数据。将侦听器附加到数据库时,服务器将检查该侦听器是否保证始终满足规则(无论数据如何)。如果不符合规则,则立即拒绝侦听器。
因此,如果将侦听器附加到/messages
,则服务器将检查您是否具有对/messages
的读取权限。而且由于您不这样做,它会拒绝侦听器。
如果要允许用户阅读他们是所有者的邮件,则需要两件事:
仅检索用户拥有的消息的查询。
确保仅允许查询的安全规则。
有关更多信息,请参见Firebase documentation on securely querying data和blog post introducing this feature。