我有一个Google Firestore实时数据库,其中包含标志isPublic
。如果设置为true
,则未经身份验证的用户可以读取子节点details
。如果设置为false
,则该记录只能由一个(目前)经过身份验证和授权的用户访问。
授权用户是唯一具有写许可权的人。
此外,子节点private
始终仅向一个授权用户授予访问权限。
我研究过的解决方案基于基于查询的规则https://firebase.google.com/docs/database/security/securing-data#query-based_rules
不幸的是,即使是授权用户,我也收到permission_denied
的回复。
除了信息:这是在使用Firebase SDK的Vue JS项目中。
这是我的数据库示例。
第一个产品应该对未经身份验证的用户具有对details
的读取权限,但对private
则没有读取权限。
通过强制用户运行查询dbRef.orderByChild('isPublic').equalTo(true)
"products": {
"-pushIdxyz1" : {
"isPublic" : true,"private" : {
"notes" : "lorem ipsum always private","soldDate" : ""
},"details" : {
"imageURL" : "https://firebasestorage.imagexyz","keywords" : "this,that","title" : "Public product title","workCategory" : "hardware",},"-pushIdxyz2" : {
"isPublic" : false,"title" : "Secret product title",}
}
我的无效规则
"rules": {
"products": {
"$product_id": {
".indexOn": "isPublic",".read": "query.equalTo == true || auth.uid == '[admin user id]'"
// alternative attempt
// ".read": "(query.orderByChild == 'isPublic' && query.equalTo == true) || auth.uid == '[admin user id]'",".write": "auth.uid == '[admin user id]'","details": {
".read": true,"private": {
".read": "auth.uid == '[admin user id]'",}
}
}
}
对于未经授权的用户,此查询应授予对明细子节点的读取访问权限:
firebase.database().ref('products').orderByChild('isPublic').equalTo(true).once('value')
.then(...)
此查询(仅适用于授权用户)应授予对所有数据的读取权限
firebase.database().ref('products').once('value')
.then(...)
在当前设置下,无论是否以授权用户身份登录,我都对查询“权限被拒绝”。