我有一个如下所示的安全规则:
"user_feeds": {
"$userId": {
".indexOn": ["timestamp"],
".read": "auth != null",
"$postId" : {
".write": "auth != null && newData.parent().hasChild(newData.child('band_id').val())"
}
}
}
在我的$postId
子树中,我试图检查父级是否有一个节点与正在插入的数据的band_id
值相对应。
数据如下:
{
post_id: 1,
band_id: '-L-tyesfsdf13434',
timestamp: 34234234234
}
这些规则对应的实际树看起来像:
{
"user_feeds": {
"userId1": {
"-L-tyesfsdf13434": true
}
}
}
我正在使用Ionic / Angular,这是我的功能,它实际上正在尝试执行写操作:
addPostToFollowers(bandId, postId) {
// 1. Get the user's connections
this._bands.getBandFollowers(bandId).take(1).subscribe(connections => {
if(connections.$value !== null) {
delete connections['$key'];
delete connections['$exists'];
let connectionKeys = Object.keys(connections);
// 2. Go through those connections and add the post
let bandFeeds = {};
connectionKeys.forEach(connectionKey => {
bandFeeds[`/user_feeds/${connectionKey}/${postId}`] = {
post_id: postId,
band_id: bandId,
timestamp: -(+(new Date()))
}
})
// 3. Update the social feeds
this.db.object(`social`).update(bandFeeds);
}
})
}
然而,当我试图运行它时,我得到了一个拒绝的权限,我不明白为什么。我在这里做错了吗?
答案 0 :(得分:0)
尝试使用root.child('user_feeds').child($userId)
代替newData.parent()
:
"user_feeds": {
"$userId": {
".indexOn": ["timestamp"],
".read": "auth != null",
"$postId" : {
".write": "auth != null && root.child('user_feeds').child($userId)
.hasChild(newData.child('band_id').val())"
}
}
}
我怀疑newData
快照仅限于该位置的数据,parent()
不能用于获取数据库树中较高位置的数据。
答案 1 :(得分:0)
所以这是我更新的规则。我需要正确引用另一条路径:
"user_feeds": {
"$userId": {
".indexOn": ["timestamp"],
"$postId" : {
".write": "auth != null && (root.child('social').child('user_band_follows').child($userId).hasChild(newData.child('band_id').val()) || root.child('social').child('user_band_follows').child($userId).hasChild(data.child('band_id').val()) || root.child('social').child('user_connections').child($userId).hasChild(auth.uid))"
}
}
}