0

我有一个火力地堡数据库以下规则:火力地堡数据库规则和PERMISSION_DENIED错误

{ 
    "rules": { 
    "messages": { 
     "$message": { 
     ".read": "true", 
     ".write": "newData.child('uid').val() === auth.uid" 
     } 
    } 
    } 
} 

的数据结构是这样的:

enter image description here

我可以写入没有问题,但是当我尝试阅读时,出现以下错误:

Error: permission_denied at /messages: Client doesn't have permission to access the desired data. 

我已阅读firebase文档,并且我的结构看起来与给出的示例相同。请,有人能告诉我这有什么问题吗?

请注意:在“消息”下移动读取规则确实解决了问题,但不是我想要的解决方案,因为我想根据消息数据(类似于写入规则)编写规则基本规则工作。我想用这样一个规则来结束:

{ 
    "rules": { 
    "messages": { 
     "$message": { 
     ".read": "data.child('uid').val() === auth.uid", 
     ".write": "newData.child('uid').val() === auth.uid" 
     } 
    } 
    } 
} 

回答

1

你在/messages/$message定义不影响查询/messages制成,因为你还没有添加任何读取权限/messages,你得到许可被拒绝的规则。

如果您想要检索单个用户发出的邮件,请考虑重构您的数据以将用户的邮件嵌套在其用户名下,例如,

{ 
    "rules": { 
    "user-messages": { 
     "$uid": { 
     ".read": "auth.uid === $uid", 
     "$mid": { 
      ".write": "newData.child('uid').val() === $uid" 
     } 
     } 
    } 
    } 
} 

使用此结构,您可以检索用户拥有的所有消息。如果您想要检索所有邮件,则还需要将邮件写入/messages。在这里您可以存储消息数据,并且在/user-messages/$uid中,可以存储用户发布的每条消息的密钥。您可以使用多位置更新同时执行两个写操作)。

{ 
    "messages": { 
    "a": { "uid": "0", ... }, 
    "b": { "uid": "0", ... } 
    } 
    "user-messages": { 
    "0": { 
     "a": true, 
     "b": true 
    } 
    }, 
    "users": { 
    "0": { ... } 
    } 
} 

获取用户消息的密钥user-messages/$uid,然后获取每条消息。

+0

嗯..我从这样的结构开始,但我的问题是,我有两个用例;一个用户只能看到他们自己的消息,另一个用户在管理员看到所有消息。管理员查询需要能够通过诸如消息打开或关闭等属性进行过滤。当我试图用更嵌套的结构来做到这一点时,我发现编写管理查询是不可能的(太多的嵌套)。听起来像我回到了绘图板... :-( –

+0

所以只有管理员可以看到所有的消息,所以用户只能看到他们的消息? – Callam

+0

是的,这是正确的。我有一个令牌,我可以识别这个问题正在构造数据,所以我可以查询它并且用户可以阅读他们自己的消息。 –