我正在尝试根据收件人显示邮件列表但是现在,让我们保持简单。我只是想显示一个消息列表。
我的规则看起来像这样
{
"rules": {
"communications" : {
"$communication":{
".read" : true,
".write": true
}
}
}
出于某种原因,我的应用程序不想阅读它
fireRef = new Firebase(url);
fireRef.auth(MY_TOKEN);
commsRef = fireRef.child('communications')
$scope.communications = $firebase(commsRef)
只有当我的规则看起来像
时才有效{
"rules": {
"communications" : {
".read" : true,
".write": true
}
}
但是这会导致问题,因为我想在我的通信的子节点上添加条件。类似的东西:
{
"rules": {
"communications" : {
".read" : true, ### I would like to get rid of this line as well and have the child handling it
".write": true,
"$communication":{
".read" : "data.child('to').val() == auth.uid"
}
}
}
我假设这是因为我在通信上有一个$ firebase,它需要一些读取或写入规则但是如何在添加新消息时获取事件
由于
答案 0 :(得分:3)
关于安全规则,Firebase操作是全有或全无。
这意味着发送到客户端的数据列表永远不会完整,或者是完整服务器数据的过滤视图。因此,在使用第一组安全规则时,尝试加载/communications
处的所有数据将失败,即使您确实有权读取{{1}处的子规则所管理的某些数据。 1}}。
要处理此用例,请考虑重新构建数据,以便每个通信都由收件人编制索引,即/communications/$communication
,这将简化您的安全规则。
此外,您甚至可以让收件人只读该存储桶(即/communications/$recipient/$communication
),同时允许任何人向该用户发送消息(即.read: auth.id == $recipient
)。最后一条规则确保发送客户端经过身份验证并写入尚不存在的位置,例如新的推送ID。