我刚接触Firebase,感到自己完全被数据库规则迷住了。我需要允许用户读取所有者字段等于特定值的项目。
这是我拥有的记录结构:
{
"books" : {
"-LKwbZsfy55d24kwX4tf" : {
"description" : "Adventures",
"title" : "Captain Donsak",
"owner" : "b7bS753Hvc0fmQ24Jnc"
},
"-LKwc1Xna07nequDtpF6" : {
"description" : "History",
"title" : "World War II",
"owner" : "hLoOnnv4883Vhvm9Vt4"
},
"-LKwi4qcsqbgvZPdhCXp" : {
"description" : "Adventures",
"title" : "Sea Wolf",
"owner" : "umV4hFm96vpdwBytx63"
}
}
}
我尝试了几种规则选项,包括遵循规则(这些是在firebase文档中提供的),但是无论如何,当我应用任何这些规则时,它都会返回0个项目。
{
"rules": {
"books": {
".read": "data.child('owner').val() === 'umV4hFm96vpdwBytx63'",
".write": "auth != null"
}
}
}
{
"rules": {
"books": {
"$uid":{
".read": "root.child('owner').val() == 'umV4hFm96vpdwBytx63'",
".write": "auth != null"
}
}
}
}
如果我只指定
".read": "auth != null"
它返回所有记录,但这不是我所需要的。
我使用一个简单的js命令来读取数据:
const itemsRef = firebase.database().ref('books');
基本上,我需要使用安全规则过滤数据,但这不可能由下面的RenaudTarnec声明。因此,我将不得不使用js对其进行过滤:
const itemsRef = firebase.database().ref('books').orderByChild('owner').equalTo(owner);
请告知可能出什么问题。 谢谢。
答案 0 :(得分:2)
实际上“ Firebase规则不是过滤器”,请参见https://firebase.google.com/docs/database/security/securing-data#rules_are_not_filters
这意味着,要获取此数据,您必须使用与您的安全规则“对齐”的查询。
类似于JavaScript中的以下内容,请参见https://firebase.google.com/docs/database/web/lists-of-data
var query = firebase.database().ref('books').orderByChild('owner').equalTo('umV4hFm96vpdwBytx63');
答案 1 :(得分:1)
根据@AndréKool的建议,这就是我解决此问题的方法: 为了过滤响应项,我使用了query based security rule:
{
"rules": {
"books": {
".read": "query.orderByChild == 'owner' && query.equalTo == auth.uid",
".write": "auth != null"
}
}
}
我相应地使用了js过滤:
const itemsRef = firebase.database().ref('books').orderByChild('owner').equalTo(owner);
感谢大家的帮助! ;-)
答案 2 :(得分:0)
尝试:
{
"rules": {
"books": {
".read": "data.child('owner').val() === auth.uid",
".write": "auth != null"
}
}
}