2016-12-27 3 views
1

ユーザーが値でレコードを検索できるようにしたいが、すべてのレコードをリストすることはできない。Firebaseデータベース:インデックスアクセスのない値で検索する

たとえば、私はwikiを作成したいが、いくつかのページは直接URLでしかアクセスできないようにしたい。

私はレコードレベルで読み取りアクセス権を与えることができ、ユーザーはすべてのキーを読み取ることができないことがわかっていますが、私は/その他の文字。

だから私は物のパスをpathのプロパティに保存してから、pathで物を探します。

// database structure 
things 
    -KNi4OQXGXsHKYHVuTln 
     path: "should/not/be/listed/anywhere" 

私は、ユーザーがパスを知っている場合にのみ、その物を見つけるようにしたいと考えています。

// request with javascript 
firebase.database() 
    .ref('/things').orderByChild('path') 
    .equalTo("should/not/be/listed/anywhere") 
    .once('value', s=>{ }); 

私は/thingsへの読み取りアクセス与えなければならないだろう意味:

// database security rules 
{ 
    "rules": { 
     "things": { 
      ".read": true, 
      ".indexOn": ["path"], 
      "$thingId": { 
       ".validate": "newData.hasChildren(['path']) && newData.child('path').isString()" 
      } 
     } 
    } 
} 

とその効果を

は、問題は、私が唯一orderByChildequalTo/thingsを検索してものを見つけることができますです誰もが私が持っているすべてのものを見ることができます。それを避ける方法はありますか?

もしそうでなければ、私はプロパティ値で見つけたらすぐにFirebaseが私のすべてのものを公開するように強制しますか?

答えて

2

Firebaseデータベースで何かを見つけるには、そのファイルへの読み取りアクセス権が必要です。それを避ける方法はありません。

通常、これは「ルールはフィルタではありません」と呼ばれ、documentationthis answerおよびsearching for "rules are not filters" on Stack Overflowに詳細があります。

アクセス不可の検索を提供する場合は、信頼できるコードを実行して一致するアイテムのパスをクライアントに公開する独自の検索サービスを設定する必要があります。

Firebaseの前でこのような検索サービスを設定する一般的な方法は、Firebase Flashlight library for ElasticSearchまたはAlgoliaのようなクラウド検索サービスです。

+0

ありがとうフランク。よりシンプルなプロジェクトのためのサーバーの作成と保守を避けることを望んでいました。 – Yura

1

私はそれを簡単にするためにサーバーを維持する必要があるはずなので、私は自分の質問に答えています。

私の実際の問題は、ユーザーがキーを知っているときにユーザーがアクセスできるようにすることでしたが、すべてのものを見たいとは思わなかったということでした。私は、物事レベルのアクセスとパスをキーとして使用することでそれを行うことができますが、キーでは/を使用することができません。もちろん、私の物の構造がフラットであることを望みました。

再びその時に見た後、私は

  • 最大768あるlimitations on keys in firebaseを、見つけた文字
  • 禁止文字:. $ # [ ] /
  • いくつか使用できる文字:だから\ ! @ % & ? : ; , * = + < > () | " '^~ - _

は私がすることができます禁止された文字を許可された文字に変換するための単純なマップを作成し、そのパスをキーとして使用して、私のprobを解決しますlem:ユーザーはパスを知っているときにのみアクセスでき、パスはURLとして見える。

関連する問題