2 回答
TA贡献1836条经验 获得超3个赞
如果您希望用户能够从products节点读取数据,则需要.read在该节点上设置规则。并且由于您只想允许读取公共产品的查询,因此您应该验证该特定查询。
像这样的东西:
"rules": {
"products": {
".indexOn": "isPublic",
".read": "(query.orderBy == 'isPublic' && query.equalTo == true)
|| auth.uid == '[admin user id]'"
}
}
所以:
您定义的规则级别太低,这意味着所有读取/products都被拒绝。
你的规则不是检查orderBy字段。
请注意,.read您声明的附加规则在private这里毫无意义,因为无论如何,同一个用户已经获得了对整个 `products 节点的读取权限。
TA贡献1772条经验 获得超8个赞
Franks 的回答为我指明了正确的方向(谢谢!),但我决定自己发布一个更完整的答案。
这是数据结构。请注意,我将“isPublic”更改为“isPublished”。“products”现在包含两个子节点:“private”和“public”。两者都使用相同的密钥。
// Firebase Data
"products": {
"private" : {
"-pushId_1" : {
"notes" : "Private notes product 1",
"soldDate" : ""
},
"-pushId_2" : {
"notes" : "Private notes product 2",
"soldDate" : ""
}
},
"public" : {
"-pushId_1" : {
"imageURL" : "https://firebasestorage.imagexyz",
"isPublished" : true,
"title" : "Published product title",
},
"-pushId_2" : {
"imageURL" : "https://firebasestorage.imagexyz",
"isPublished" : false,
"title" : "Unpublished product title, only accessible if authorized",
}
}
}
如果查询查找已发布的产品,规则允许管理所有内容并允许未经身份验证访问公共子节点
// Firebase Rules
{
"rules": {
"products" : {
".read": "auth.uid == '[admin user id]'",
".write": "auth.uid == '[admin user id]'",
"public" : {
".indexOn": "isPublished",
".read": "(query.orderByChild == 'isPublished' && query.equalTo == true)"
}
}
}
}
要创建新产品,我首先推送到“公开”,然后使用返回的密钥创建私有记录
// Add new product
db.ref('products/public').push(publicData)
.then((data) => {
key = data.key
return key
})
.then((key) => {
db.ref('products/private').child(key).update(privateData)
return key
})
.then( ... )
要获得产品,公共/未经身份验证的用户必须isPublished在公共场所寻找。管理员可以循环访问公共和私有子节点
// Retrieve products - Public
db.ref('products/public').orderByChild('isPublished').equalTo(true).once('value')
.then((data) => {
let publicData = data.val()
// Do something with the data
})
// Retrieve products - Admin
db.ref('products').once('value')
.then((data) => {
let publicData = data.child('public').val()
let privateData = data.child('private').val()
// Do something with the data
})
添加回答
举报