【问题标题】:How do I get the number of children in a protected Firebase collection?如何获取受保护 Firebase 集合中的子项数量?
【发布时间】:2013-07-11 20:08:16
【问题描述】:

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: firebase firebase-security


    【解决方案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() );
       });
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2021-07-23
      • 2021-07-25
      • 1970-01-01
      • 2021-06-01
      • 2021-11-04
      • 2023-01-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多