1

サイトのユーザー用に保護されたfirebaseコレクションがあり、ユーザーオブジェクトの配列だけです。ユーザーのパーミッション ルールにより、認証されたユーザーは、ユーザー リスト内の自分のユーザー オブジェクトにのみアクセスでき、それ以外のユーザーにはアクセスできません。

この許可スキームを使用してコレクション内のすべてのユーザーの数を取得する簡単な方法を設定しようとしています。これにより、サイトの合計ユーザー数を表示できますが、数を取得する方法がないようです許可の問題を取得することなく、すべてのユーザーの。

これを修正する方法についてのアイデアはありますか?

ユーザーが追加/削除されるたびに増分および減分される公に読み取り可能なfirebaseの場所にカウントを保存できると思いますが、データを2回保存して不一致を心配したくありません。

サーバーに認証済みのウォッチャーを配置して、アクセス許可の要件をバイパスし、クライアントに (パブリックの場所に書き込むか、API として公開することで Firebase を介して) ユーザー カウントを送信することもできると思います。

理想的には、現時点ではすべてをクライアント側に置きたいので、これに対する簡単なアクセス許可ベースのソリューションがあれば教えてください。

ありがとう!

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 に答える