如何获取受保护的Firebase集合中的子项数?

时间:2013-07-11 20:08:16

标签: firebase firebase-security

我为我的网站用户提供了受保护的firebase集合,只是一组用户对象。用户的权限规则允许经过身份验证的用户仅访问用户列表中的用户对象,而不允许其他人访问。

我正在尝试使用此权限方案设置一种简单的方法来获取集合中所有用户的计数,以便我可以在我的网站上显示总用户数,但似乎没有办法在没有获得权限问题的情况下获取所有用户的数量。

有关如何解决此问题的任何想法?

我想我可以在一个公共可读的firebase位置存储一个计数,只要添加/删除用户就会增加和减少计数,但我宁愿不将数据存储两次并担心不匹配。

我想我也可以在我的服务器上有一个经过身份验证的观察程序绕过权限要求并通过写入公共位置或作为api公开的用户计数发送给客户端(通过firebase)。

理想情况下,我现在想要客户端的所有内容,所以如果有一个简单的基于权限的解决方案,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:1)

数据复制几乎是NoSQL的常态,因此存储计数器是完全合理的。查看denormalization

上的Firebase文章

这几乎总结了我理解它们的方法。

使用计数器

这很快,而且相当简单,假设你正在使用良好的DRY原则并集中所有对记录的操作。每次添加或删除记录时,使用事务更新计数器:

function addUser(user) {
   // do your add stuff...
   updateCounter(1);
}

function removeUser(user) {
   // do your remove stuff...
   updateCounter(-1);
}

function updateCounter(amt) {
   userCounter.transaction(function(currentValue) {
      currentValue || (currentValue === 0); // can be null
      return currentValue + amt;
   });
}

单独的公共和安全数据

将敏感数据(电子邮件地址,人们无法看到的内容)存储在私有路径中,保持其公共用户数据的可读性。

这可以防止需要同步计数器。但是,它确实意味着客户端必须下载整个公共用户列表才能创建计数。因此,保持公共资料很小(一个名字,一个时间戳,而不是其他),所以它可以成千上万,而不用几秒钟。

"users": {
   ".read": true,
   "$user": {
       // don't try to put a ".read" here; it won't remove access
       // after the parent path allows it
   }
}

"users_secured": {
   "$user": {
       ".read": "auth.id === $user"
   }
}

利用服务器进程

轻松无痛;对于客户而言,只要占用空间小,就能轻松处理数十万个配置文件。需要你维护一些东西。 HerokuNodejitsu将免费托管此内容,直到您的用户不知所措为止。

var Firebase = require('firebase');

var fb = new Firebase(process.env.FBURL);
fb.auth( process.env.SECRET, function() {
   fb.child('users').on('value', function(snap) {
      fb.child('user_counter').set( snap.numChildren() );
   });
}