1

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

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

关于如何解决这个问题的任何想法?

我想我可以将计数存储在公开可读的 firebase 位置,每当添加/删除用户时,该位置就会递增和递减,但我宁愿不要两次存储数据并担心不匹配。

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

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

谢谢!

4

1 回答 1

1

数据重复几乎是 NoSQL 中的常态,因此存储计数器是完全合理的。查看有关非规范化的 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() );
   });
}
于 2013-07-18T21:32:47.527 回答