我正在使用firebase实时数据库并使用firebase-query
和firebase-document
查询数据。我配置了一些规则,当在模拟器中运行时,读取被接受但在现实生活中读取ID被拒绝。必须在root中".read": true
才能获得预期的结果。 注意:我正在使用polymerfire
和Firebase js sdk,但是对于不同的东西,JS在外部文件上,我正在使用Bolt编译器编写规则。
规则:
rules.bolt
//Questions
path /Question/{qid} {
read() { true }
write() { true}
}
//Users
path /Users/{uid}/Profile {
read() { true }
write() { signedIn() && isUser(auth, uid) }
}
path /Users/{uid}/Metadata {
read() { signedIn() && isUser(auth, uid) }
write() { signedIn() && isUser(auth, uid) }
}
function signedIn (){ auth != null}
function isUser (auth, userKey) {
return auth.uid == userKey;
}
rules.json
{
"rules": {
"Question": {
"$qid": {
".read": "true",
".write": "true"
}
},
"Users": {
"$uid": {
"Profile": {
".read": "true",
".write": "auth != null && auth.uid == $uid"
},
"Metadata": {
".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"
}
}
}
}
}
期望影响
初始化存储的值,只能从Questons/{{qid}}
和Users/{{uid}}/Profile
(以及Users/{{uid}}/Metadata
读取数据,如果用户看到他/她获胜的个人资料)并显示所有数据
现实
未使用时".read": true
:
Initializing stored value.
并且在模拟器读取中运行时,没有数据传入但。
使用时".read": true
:
Initializing stored value.
Sync to memory.
Updating data from Firebase value: {Metadata: {…}, Profile: {…}}
Got stored value! {Metadata: {…}, Profile: {…}} {Metadata: {…},
Profile: {…}}
Sync to memory.
和其他数据也会传入并显示。
我认为这是因为规则级联。
如果规则级联是如何使用Bolt解决这个问题,如果不是,那么该做什么?