2013-08-21 23 views
0

这里我使用angularFire获取数据:
是否可以限制发送给Firebase中未经身份验证(angularfire)客户端的数据量(“门”数据)?

angular.module('FireApp', ['firebase']) 
    .controller('Document', function($scope, $routeParams, angularFire){ 
    var url = "https://my-account.firebaseio.com/test" + "/" + $routeParams.data; 
    angularFire(url, $scope, data); 
}); 

的问题是,这将载入“https://my-account.firebaseio.com/test/data”及其所有的孩子和孙子等..
的“/数据”是一个数组对象,它可以(但不必 - 它很可能是一个字符串数组)的类似于“/数据”的父:

data: ["0" : { 
    "data" : [...], 
    "meta" : { 
     "active" : false 
    }, 
    "sign" : [...] 
    }, 
    "1" : { 
    "data" : [...], 
    "meta" : { 
     "active" : true 
    }, 
    "sign" : {...} 
    }, 
    "2" : { 
    "data" : [...], 
    "meta" : { 
     "active" : false 
    }, 
    "sign" : {...} 
    }] 

基本上,我希望所有未经验证的angularFire客户只接收th数据数组的元素,其中布尔标志meta.active = true,即活动标志需要决定,而其祖父将在angularFire请求时发送给客户端。未经身份验证的客户端也无法写入/编辑任何数据。我想设置的规则应该是这样的:“只要'active = false'标志被设置,不要将标志的祖父母发送到angularFire客户端,除非客户端被认证。”所以是的规则需要是相对的而不是绝对的。
只有经过身份验证的客户端才能够接收/编辑所有数据。
我可以使用Firebase简单登录和安全规则制定这样的规则吗?
如果祖父母不能做到这一点,可以将“主动”标志向上移动一级以影响其父母。
谢谢您的时间,
贾里德

回答

1

你需要调整,以便与火力地堡达到这个数据。看到这个博客文章的一些背景:https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html

结构化数据的一种方法是创建两个单独的列表,一个用于活动项目,另一个用于非活动项目。当一个项目变为活动或非活动状态时,确保将其从一个列表中删除并放入另一个列表中。

{ 
    "active": { 
    0: { 
     "data": {...}, 
     "sign": {...} 
    } 
    }, 
    "inactive": { 
    0: { 
     "data": {...}, 
     "sign": {...} 
    } 
    } 
} 

在你的安全规则,你可以简单地阻止访问非活动项目未经验证的用户:

{ 
    "rules": { 
    "active": { 
     ".read": true 
    }, 
    "inactive": { 
     ".read": "auth != null" 
    } 
    } 
} 

希望这有助于!

+0

谢谢Anant。你的解决方案看起来很合理,但是它能工作任意数量的嵌套'数据'节点,它们还包含活动/非活动分隔? –

+0

因为我想推动我的项目,所以我很感谢您对以上问题的及时答复。 –

+1

不,它不适用于嵌套节点。如果你想嵌套,我会考虑创建一个全局活动/不活动列表(使用FirebaseRef.push()为每个对象生成唯一的ID),然后将这些对象的名称作为引用存储在数据节点中。然后你可以嵌套,但是你也需要在从适当的列表中检索它的名字后获取实际的对象。 – Anant

相关问题